无法将 set('personName', s) 委托给对象代理<DS.PromiseObject:ember323>的 'content' 属性:其 'content' 未定



我正在尝试使用 ember js,但我无法在模型中使用多个模型,具有字符串属性的单个模型很容易......

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'})
});

我的路线 路由/客户端/创建

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')
}
);
}
});

我的模板只有一行:

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

在我的client-form.hbs中,我有一些字段引用了client.person.personName或client.person.greeting,当我输入第一个字符时,我会得到问候语或personName。

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

所以我也直接在客户端模型中添加了personName和greeting,并添加了两个引用client.personName和client.greeting的字段,这些字段不会给我带来任何问题。我相信人员模型没有初始化,也许客户端被实例化,但人员和地址没有,人是一个未定义的对象。

这种模型的原因是我有一个java后端,我的ClientDTO看起来像:

public class ClientDTO /*implements IsSerializable*/ {
private PersonDTO personDTO;
private AddressDTO postalAddress;
private AddressDTO residentialAddress;

我错过了初始化人员和地址的地方,我可以找到 ppl 有错误"无法调用定义"但不在设置中。 编辑: 现在,在网上查看了一些示例后,我更改了控制器以初始化一些模型

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'}});
});
}
}
});

并将我的创建路由更改为

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')
}
);
}
});

现在我得到:

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

这只是说同样事情的另一种方式。我认为我没有正确创建路线中的模型。

您正在很好地创建模型,但没有正确关联它们。

'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'
}),

你想要的更像是:

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 );

然后在模板中,只需将client传递给组件即可

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

在您的模板中使用client.person等。

如果你仍然想从模型钩子返回一个哈希,你可以这样做:

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
});

最新更新