在创建新模型实例之前是否需要使用createRecord?

时间:2014-09-04 07:57:07

标签: ember.js ember-data

在使用ember和ember-data构建我的第一个应用程序时,我注意到,在为新创建的模型输入输入字段时,我开始收到以下错误:

  

断言失败:无法将set('notes',t)委托给object proxy的'content'属性:其'content'未定义。

我通过在路线中添加以下代码解决了这个问题:

App.LessonNewRoute = Ember.Route.extend({
    model: function() {
        return this.store.createRecord('lesson');
    } 
});

我的理解是,当我使用ObjectController创建(而不是让ember生成)LessonController时,会发生此错误。

我现在想知道:

  1. 在创建新模型实例之前是否需要使用createRecord?
  2. 这是防止此错误发生的最好方法吗?

1 个答案:

答案 0 :(得分:1)

据我了解,您的方法很好。

为了在视图中使用模型,您必须以某种方式提供模型实例。因此,如果您在未分配任何内容时尝试使用content,则会失败。我用不同的方法绕过它,但在动作处理程序中创建记录。

对于某些场景,特别是对于小型模型,我通常在控制器中创建相应的属性(一种viewModel方法),并使用一个动作来处理保存。然后我实际在该操作中创建记录,传递createRecord的控制器属性参数。

示例(完全概念性):

...

App.Person = DS.Model.extend({
    name: DS.attr('string')
});

...  

App.PersonAddController = Em.ObjectController.extend({

    personName: null,

    actions: {
        save: function() {

            var theName = this.get('personName');

            var person = this.store.createRecord('person', {name: theName});

            person.save().then(
                 ...pointers to success and failure handlers go here...
            ).done(
                 ...transition goes here...     
            );

        }, 
        cancel: function {
            this.set('personName', null);
        }
    }

})

然后在模板中,我将输入绑定到控制器prop而不是模型。

{{input type="text" value=controller.personName}}

使用这种方法,我的Route#model不会输出要添加到商店的空白模型,因此我不必处理rollback或其他任何内容。