EmberJS - 如何从 hasMany 关系中删除一个对象然后重新推送它?

EmberJS - How to remove an object from hasMany relationship and then repush it?

我尝试从关系中删除一个模型,然后使用 pushPayload 再次导入它。

关系只更新一侧,不更新另一侧。

this.get('store').pushPayload({
  folder: {
    id: 1,
    name: 'My folder'
  }
});

this.get('store').pushPayload({
  item: {
    id: 2,
    name: 'My item',
    parentFolder: 1
  }
});

var folder = this.get('store').peekRecord('folder', 1);
var item = this.get('store').peekRecord('item', 2);

console.log('Parent folder id: ', item.get('parentFolder.id'), 'Items length', folder.get('items.length'));
item.get('parentFolder').get('items').removeObject(item);
console.log('Parent folder id: ', item.get('parentFolder.id'), 'Items length', folder.get('items.length'));

this.get('store').pushPayload({
  item: {
    id: 2,
    name: 'My item',
    parentFolder: 1
  }
});
console.log('Parent folder id: ', item.get('parentFolder.id'), 'Items length', folder.get('items.length'));

我希望得到以下输出:

Parent folder id:  1 Items length 1
Parent folder id:  undefined Items length 0
Parent folder id:  1 Items length 1

但是我得到了这个:

Parent folder id:  1 Items length 1
Parent folder id:  undefined Items length 0
Parent folder id:  1 Items length 0

最后一期Items length.

https://ember-twiddle.com/d58d95d5be0cc8750282b9cc48db6489

如果您要使用 pushPayload 将记录重新添加,并且您希望有效负载 "win" 超过您在本地的关系,则需要卸载记录:

item.get('parentFolder').get('items').removeObject(item);
this.get('store').unloadRecord(item);
this.get('store').pushPayload({
  item: {
    id: 2,
    name: 'My item',
    parentFolder: 1
  }
});

我用关于每次推送会发生什么的带注释的评论修改了你的玩笑。 pushpushPayload 之间的区别在于后者在将数据规范化为您在此处看到的格式后调用前者。

https://ember-twiddle.com/c65c33ce0b1810258b75b5679b75d0e4?fileTreeShown=false&openFiles=controllers.application.js%2C

简短的回答是 folder 具有必须清除的本地状态(项目的删除)才能使您的服务器更改生效。虽然 unloadRecord 是实现此目的的一种方法,但它是偶然的 side-effect 并且有许多更好的方法(我的 twiddle 中使用 push 显示了一种方法,您也可以使用 pushObject 来放置您移除的物品。