尝试使用 Ember 中的记录时内容未定义
Content is undefined when trying to work with a record in Ember
我正在尝试更新 Ember 商店中的记录。当我尝试这样做时,returns 出现以下错误:
Uncaught Error: Assertion Failed: Cannot delegate set('name', test) to the 'content' property of object proxy : its 'content' is undefined.
控制器看起来像这样:
import Ember from 'ember';
export default Ember.Controller.extend({
model: null,
event: {
name: "test",
id: "adfg8943224xcvsdf"
},
actions: {
editEvent (event) {
var Event = this.store.find('event', event.id);
Event.set('name', event.name);
Event.save()
}
}
});
路线如下所示:
import Ember from 'ember';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model () {
return {
event: this.store.find('event')
}
},
setupController (controller, model) {
controller.set('model', model);
}
});
模板触发动作,发送一个名为事件的对象,该对象具有名称和 ID 等属性。事件对象的值来自控制器,并在触发 editEvent 操作之前设置:
<form {{action 'editEvent' event on="submit"}}>
我相信正在发生的事情是您的 model
钩子正在 returning 一个包含将解决的承诺的 POJO。如果你想把它传递给你的动作,那么你需要做
<form {{action 'editEvent' model.event on="submit"}}>
话虽如此,您实际上应该 return 来自 model
挂钩的承诺,这样 Ember 将在呈现模板之前等待您的数据加载。使用您现在设置的方式,如果您的数据需要很长时间才能加载,有人可能会在模型加载之前提交表单,您将收到错误消息。
我想你希望你的路线看起来像这样(不需要覆盖 setupController
):
import Ember from 'ember';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model () {
return this.store.find('event');
}
});
然后在您的模板中:
<form {{action 'editEvent' model on="submit"}}>
如果您需要加载多个模型,那么您应该使用 Ember.RSVP.hash
。
看到这个答案:EmberJS: How to load multiple models on the same route?
另外,我不太确定你的操作是想做什么,但你不需要再次查找记录。您为操作发布的代码实际上并没有做任何事情。它获取事件,然后将事件的名称设置为其自己的名称。
actions: {
editEvent (event) {
// you already have the event, you passed it in as a parameter
// you don't need to query the store again for it.
var Event = this.store.find('event', event.id);
// This doesn't do anything as it just sets the event.name to itself
Event.set('name', event.name);
Event.save()
}
}
我想你的意思是:
actions: {
editEvent (event) {
event.set('name', 'updated name');
event.save();
}
}
我正在尝试更新 Ember 商店中的记录。当我尝试这样做时,returns 出现以下错误:
Uncaught Error: Assertion Failed: Cannot delegate set('name', test) to the 'content' property of object proxy : its 'content' is undefined.
控制器看起来像这样:
import Ember from 'ember';
export default Ember.Controller.extend({
model: null,
event: {
name: "test",
id: "adfg8943224xcvsdf"
},
actions: {
editEvent (event) {
var Event = this.store.find('event', event.id);
Event.set('name', event.name);
Event.save()
}
}
});
路线如下所示:
import Ember from 'ember';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model () {
return {
event: this.store.find('event')
}
},
setupController (controller, model) {
controller.set('model', model);
}
});
模板触发动作,发送一个名为事件的对象,该对象具有名称和 ID 等属性。事件对象的值来自控制器,并在触发 editEvent 操作之前设置:
<form {{action 'editEvent' event on="submit"}}>
我相信正在发生的事情是您的 model
钩子正在 returning 一个包含将解决的承诺的 POJO。如果你想把它传递给你的动作,那么你需要做
<form {{action 'editEvent' model.event on="submit"}}>
话虽如此,您实际上应该 return 来自 model
挂钩的承诺,这样 Ember 将在呈现模板之前等待您的数据加载。使用您现在设置的方式,如果您的数据需要很长时间才能加载,有人可能会在模型加载之前提交表单,您将收到错误消息。
我想你希望你的路线看起来像这样(不需要覆盖 setupController
):
import Ember from 'ember';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
model () {
return this.store.find('event');
}
});
然后在您的模板中:
<form {{action 'editEvent' model on="submit"}}>
如果您需要加载多个模型,那么您应该使用 Ember.RSVP.hash
。
看到这个答案:EmberJS: How to load multiple models on the same route?
另外,我不太确定你的操作是想做什么,但你不需要再次查找记录。您为操作发布的代码实际上并没有做任何事情。它获取事件,然后将事件的名称设置为其自己的名称。
actions: {
editEvent (event) {
// you already have the event, you passed it in as a parameter
// you don't need to query the store again for it.
var Event = this.store.find('event', event.id);
// This doesn't do anything as it just sets the event.name to itself
Event.set('name', event.name);
Event.save()
}
}
我想你的意思是:
actions: {
editEvent (event) {
event.set('name', 'updated name');
event.save();
}
}