【问题标题】:Best Practice for Creating New Record with belongsTo Relationship使用 belongsTo 关系创建新记录的最佳实践
【发布时间】:2014-08-18 09:43:04
【问题描述】:

我想知道在 Ember 中使用 createRecord() 创建新记录然后将其持久化到 API 的最佳实践?具体来说,Ember 的 POST 请求一般应该是嵌入所有模型关系的单个 JSON,还是习惯上单独 POST 每个关系?

在我的代码中,我无法获得单个 JSON,所以我想知道我是否缺少“Ember Way”或者(更有可能)我的代码有错误?

详情:

这是我的设置的详细信息。我有两个模型:

/models/OrgUser.js:

DS.Model.extend({
    ...
    orgPerson: DS.belongsTo('org-person', { inverse: 'org-user', async: true, embedded: 'always' }),
});

/models/OrgPerson.js:

DS.Model.extend({
   ...
   orgUser: DS.belongsTo('org-user'),
})

我正在尝试在“创建新用户”页面上创建新用户。该页面的路线如下。这是为我的新模型致电createRecord() 的最佳地点吗?

/routes/org-users/add.js:

Ember.Route.extend({
    model: function() {
        var orgPerson = this.store.createRecord('org-person');
        var orgUser = this.store.createRecord('org-user' );
        orgUser.set('orgPerson', orgPerson);

        return orgUser;
    },
     ...
}

在我调用 set 后使用 Chrome 控制台查看 orgUser 对象根本没有证据表明我已向 orgUser 添加任何内容。不过,Chrome 调试工具的“Ember”标签确实反映了这种关系。

在我的“创建新用户”页面上,我的输入字段都对应于OrgUser 属性和OrgUser.OrgPerson 属性。这是一个例子:

/templates/org-users/add.hbs

...
{{input value=username}} // a property of OrgUser
{{input value=orgPerson.firstName}} // a property of OrgUser.orgPerson
...

在我的路线中,当我转到 save() Ember Data POSTs 时,只有 null 值为 orgPerson. 的 orgUser JSON 我希望它在 @ 中嵌入 orgPerson 序列化对象987654338@财产。

/routes/org-users/add.js:

Ember.Route.extend({
    ...
    actions: {
        submitForm: function() {
            ...
            this.currentModel.save().then( onSuccess ).catch( onFailure );
            ...
        }
    }
});

这会产生带有以下正文的POST 请求:

{
"orgUser":{
   "username":"MyUsername",
   "orgPerson":null,
   "id":null
}

请注意,orgPerson 为空。提前感谢您的帮助!

更新:我想我需要重新审视一下我的序列化程序。这是它当前的定义方式。

/serializers/application.js:

DS.RESTSerializer.extend({

    // Use the default approach to serializing, but add the id property
    serialize: function(record, options) {
        var json = this._super.apply(this, arguments);
        json.id = record.id;
        return json;
    },

    serializeBelongsTo: function(record, json, relationship) {
    var key = relationship.key;
      key = this.keyForRelationship ? this.keyForRelationship(key, 'belongsTo') : key;

      var data = record.get('data');

      if (relationship.options.embedded && relationship.options.embedded === 'always') {
        json[key] = data[relationship.key] ? data[relationship.key].serialize( { includeId: true } ) : null;
        }
      else {
            json[key] = data[relationship.key] ? data[relationship.key].get('id') : null;
        }

        if (relationship.options.polymorphic) {
            this.serializePolymorphicType(record, json, relationship);
        }
    }
});

根据@Kingpin2k 的评论,关于如何最好地处理serialize()belongsTo 关系似乎存在一些歧义(和错误!)。我上面的序列化程序自定义非常适合通过this.store.find() 获得的记录,但现在我需要为createRecord() 启用它们。欢迎补充建议,指点!

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    这是一个错误。 https://github.com/emberjs/data/issues/1542#issuecomment-49443496

    一种解决方法是在尝试保存之前获取 async belongsTo 记录(它会欺骗 Ember Data 对其进行初始化)。在您的情况下,您可以在模型挂钩中执行此操作。

    model: function() {
        var orgPerson = this.store.createRecord('org-person');
        var orgUser = this.store.createRecord('org-user');
        orgUser.set('orgPerson', orgPerson);
        return orgUser.get('orgPerson').then(function(){
          return orgUser;
        });
    },
    

    【讨论】:

    • 感谢您的回复,@Kingpin2k。这似乎没有解决我的问题。我什至暂时删除了我所有的序列化程序自定义,但仍然遇到同样的问题。然而,它完全有问题的事实改变了我的心态,所以我将在 IntelliJ + Chrome 中使用调试模式来更好地了解正在发生的事情并会报告回来。如果您对要查看的领域或工作示例有任何其他建议,请随时分享。谢谢!
    • 用我的序列化程序更新了原始帖子。
    • 当我回到我的电脑上时,我必须检查一下。一年来,Ember 数据一直在与异步关系作斗争。
    • 对不起,我被其他一些工作牵制了,看起来异步关系存储在元数据中以供记录。这里可能有很多边缘情况,但到目前为止看起来是这样的:emberjs.jsbin.com/OxIDiVU/952/edit,棘手的是你不想使用 getter,或者你可以强制异步关系在可能不是时获取需要......所以我将在同一个 jsbin 中继续打破这个几分钟
    • 绝对是明智之举,如果您需要更新,请保持最新版本直到它达到稳定版本,这将是您未来的救命稻草......
    【解决方案2】:

    所以,我终于想通了。随着 Ember-Data-1.0.0-Beta.9、http://emberjs.com/blog/2014/08/18/ember-data-1-0-beta-9-released.html 的发布,引入了 EmbeddedRecordsMixin。这几乎解决了我所有的问题!

    所以,我最终做了以下事情:

    结果完美无缺,因为我可以完全声明式控制我的记录的嵌入方式和时间。

    特别感谢 @Kingpin2k 帮助我意识到我的序列化程序是问题所在,并通过讨论帮助我理解选项。

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多