尝试使用 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();
    }
  }