【问题标题】:Ember-data createRecord with hasMany relationship without savingEmber-data createRecord 与 hasMany 关系而不保存
【发布时间】:2025-11-30 08:40:01
【问题描述】:

我想创建一个新的站点记录。模型如下:

var SiteModel = DS.Model.extend({
    name: attr(),
    ...

    languages: DS.hasMany('language'),
});

language 属性描述了可以用哪些语言编写网站内容。要创建表单,我需要在我的路线中创建一个模型。所以我想创建一条新记录,而不将这条记录保存到数据库中:

 var WebsitesNewRoute = Ember.Route.extend({
     model: function() {
         return this.store.createRecord('site', {
              languages: Ember.A()
         });
     }
 }

这不能按预期工作,因为我收到以下错误:cannot set read-only property "languages" on object: <app@model:site::ember1012:null>>。为什么languages 属性是只读的?据我所知,我没有在我的模型中配置它......


我知道问题Ember Data- createRecord in a hasMany relationship,但就我而言,我还不想保存任何东西(我只想创建模型,所以我可以在我的模板中使用它)。

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    Ember-Data 将 languages 定义为只读属性,因为它不希望您替换数组。无论您是否保存,Ember-Data 都希望您添加与 addObject 的关系并删除与 removeObject 的关系。

    所以如果你想添加一种语言,你可以这样做:

    model: function() {
        var model = this.store.createRecord('site');
        var language = getLanguage();
        model.get('languages').addObject(language);
        return model;
    }
    

    languages 提供给createRecord 所做的实际上是在调用model.set('languages', Ember.A()),而Ember-Data 不喜欢这样。

    这很愚蠢,我知道,但这正是 Ember-Data 的工作原理。

    【讨论】:

    • 感谢 Ember 为什么将其标记为只读的解释。按照您在此处描述的设置语言确实有效。但我仍然得到了那个错误。更糟糕的是,即使我在模型函数中只写return this.store.createRecord('site');,也会弹出错误。
    • 这很可能是 Ember-Data 中的一个错误。您是否有机会创建一个重现该问题的 JSBin?
    • 关于这是否是 Ember-Data 错误的任何消息?我刚刚使用 ember-select-2 和一个设置 hasMany 关系的多选遇到了这个问题......
    • 您肯定会遇到错误,但我不能肯定地说。如果您可以在 JSBin 中重现它,我(或 ED 团队中的某个人)可能会告诉您。由于 Ember 和 Ember Data 的复杂性,如果不能复现就很难说。