2017-08-22 3 views
0

J'essaie mes mains sur ember js et je ne suis pas capable de utiliser plusieurs modèles dans des modèles, des modèles simples avec des attributs de chaîne sont faciles ...Impossible de déléguer set ('personName', s) à la propriété 'content' du proxy d'objet <DS.PromiseObject: ember323>: son 'contenu' est indéfini

model/client.js 
export default DS.Model.extend({ 
    person: DS.belongsTo('person', {async: false, inverse: 'client'}), 
    postalAddress : DS.belongsTo('address', {async: false}) , 
    residentialAddress : DS.belongsTo('address', {async: true}) , 
    personName: DS.attr('string'), //added from person 
    greeting : DS.attr('string') //added from person 
    }); 
model/person.js 
export default DS.Model.extend({ 
    name : DS.attr('string'), 
    personName : DS.attr('string'), 
    greeting : DS.attr('string') , 
    client: DS.belongsTo('client', {inverse: 'person'}) 
}); 

mon itinéraire itinéraires/client/créer

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    model() { 
    return Ember.RSVP.hash({ 

     'client': this.get('store').createRecord('client' , 
      { //does this not initialize person 
      person: 'person', address: 'address' 
      }), 
     //) 
//does this not initialize person 
      'person': this.get('store').createRecord('person',{ 
      client: 'client' 
      }), 
      'address': this.get('store').createRecord('address') 
     } 
    ); 
    } 
}); 

mon modèle a une seule ligne:

{{client-form client=model.client person=model.client.person address=model.client.residentialAddress errors=model.errors onSave=(action "save") }} 

dans mon client-form.hbs i avait des champs qui faisaient référence à client.person.personName ou client.person.greeting, et quand je taperais le premier caractère je recevrais pour saluer ou personName

Assertion Failed: Cannot call set with 'greeting' on an undefined object. 

J'ai donc ajouté directement personName et salutation dans le modèle client et ajouté deux champs se référant à client.personName et client.greeting et ces champs ne me posent aucun problème. Je crois que le modèle de personne n'est pas initialisé et peut-être que le client est instancié mais la personne et l'adresse ne l'est pas et la personne est un objet indéfini.

La raison d'un tel modèle est que j'ai un backend java et mon ClientDTO ressemble:

public class ClientDTO /*implements IsSerializable*/ { 

    private PersonDTO personDTO; 
    private AddressDTO postalAddress; 
    private AddressDTO residentialAddress; 

Où ai-je manqué l'initialisation de la personne et l'adresse, je peux trouver ppl avoir des erreurs « ne peut pas appeler obtenir sur undefined "mais pas dans l'ensemble. Edit: maintenant après avoir regardé quelques exemples en ligne j'ai changé mon contrôleur pour initialiser certains modèles

import Ember from 'ember'; 
export default Ember.Controller.extend({ 
    actions: { 
    save() { 
     console.log("yes controller"); 
     let client = this.model.client; 
     let person= this.model.person; 
     let residentialAddress = this.model.client.residentialAddress; 
     client.save().then(() => { 
     person.save(); 
     residentialAddress.save(); 
     this.transitionToRoute('message', {queryParams: {message: 'created'}}); 
     }); 
    } 
    } 
}); 

et changé créer route vers

routes/client/create.js 
    export default Ember.Route.extend({ 
     model() { 
     return Ember.RSVP.hash({ 

      client: this.get('store').createRecord('client' , 
      { 
       person: 'person', residentialAddress: 'address' 
      }), 
      //) 

      party: this.get('store').createRecord('person',{ 
      client: ' 

client' 
      }), 
      residentialAddress : this.get('store').createRecord('address') 

      } 
     ); 
     } 
    }); 

Maintenant je:

Assertion Failed: Cannot delegate set('partyName', aaa) to the 'content' property of object proxy <DS.PromiseObject:ember323>: its 'content' is undefined. 

Ce qui est une autre façon de dire la même chose. Je pense que je ne crée pas les modèles correctement.

Répondre

0

Vous créez les modèles correctement mais sans les associer correctement.

'client': this.get('store').createRecord('client' , { 
    person: 'person', // Here you are setting client.person to the string 'person', not to the person model 
    address: 'address' 
}), 

Ce que vous voulez est plus comme:

let person = this.get('store').createRecord('person'); 
let address = this.get('store').createRecord('address'); 
return this.get('store').createRecord('client', { person: person, address: address); 

// Or the same thing but use shorthand syntax to assign person and address 
let person = this.get('store').createRecord('person'); 
let address = this.get('store').createRecord('address'); 
return this.get('store').createRecord('client', { person, address); 

Ensuite, dans votre modèle juste passer le client à votre composant

{{client-form client=model ...}} 

et dans votre modèle client.person etc.

Si vous voulez toujours retourner un hachage à partir du crochet du modèle, vous pouvez o:

let person = this.get('store').createRecord('person'); 
let address = this.get('store').createRecord('address'); 
return Ember.RSVP.hash({ 
    client: this.get('store').createRecord('client', { person: person, address: address), 
    person: person, 
    address: address 
});