如何使用EmberData保持最新的异步,多对多关系

时间:2014-12-21 23:28:17

标签: ember.js ember-data

鉴于以下模型:

var post = DS.Model.extend({
    tags: DS.hasMany('tag', {async: true, inverse: 'posts'})
});

var tag = DS.Model.extend({
    posts: DS.hasMany('post', {async: true, inverse: 'tags'})
});

添加或删除标记如下所示:

var post = this.get('model');

this.store.createRecord('tag', {}).save().then(function (tag) {
    post.get('tags').then(function (tags) {
        tags.addObject(tag);

        post.save().then(function () {
            tag.get('posts').then(function (posts) {
                posts.addObject(post);

                tag.save().catch(function (res) {
                    // handle errors
                });
            });
        }).catch(function (res) {
            // handle errors
        });
    });
});

我觉得必须有一个更好的方法来处理这些问题 - 但我仍然试图围绕承诺以及如何正确使用它们。

那么,在特定帖子中添加或删除标签的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

不幸的是,更新async hasMany关系相当麻烦。所以你的解决方案是(至少在当前的ember数据状态下)已经相当不错了。您可以优化的一件事是不必两次保存新创建的tag。由于您的异步关系只发送帖子的ID,所以您可以在创建标签时立即添加当前帖子:

post = this.get('model');
this.store.createRecord('tag', {posts: [post]}).save().then(function (tag) {
  post.get('tags').then(function (tags) {
    tags.addObject(tag)
    post.save().catch(function (res) {
      // handle errors
    });
  }
}).catch(function (res) {
  // handle errors
});

..在这里,没有失败的回调,它更容易阅读:

post = this.get('model');
this.store.createRecord('tag', {posts: [post]}).save().then(function (tag) {
  post.get('tags').then(function (tags) {
    tags.addObject(tag)
    post.save();
  }
});