鉴于以下模型:
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
});
});
});
我觉得必须有一个更好的方法来处理这些问题 - 但我仍然试图围绕承诺以及如何正确使用它们。
那么,在特定帖子中添加或删除标签的最佳方法是什么?
答案 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();
}
});