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

时间:2018-03-24 22:52:22

标签: ember.js ember-data relationship

我尝试从关系中删除模型,然后使用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

2 个答案:

答案 0 :(得分:1)

我用每次推送会发生的注释评论重新设计你的旋律。 pushpushPayload之间的区别在于后者在将数据规范化为您在此处看到的格式后会调用前者。

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

简短的回答是folder具有必须清除的本地状态(删除项目)才能使服务器更改生效。虽然unloadRecord是实现这一目标的一种方式,但这是偶然的副作用,并且有许多更好的方法(使用push在我的旋风中显示一个方法),你也可以用pushObject来放置项目你已经删除了。)

答案 1 :(得分:0)

如果您要使用pushPayload将其添加回来,并且希望有效负载“胜过”本地关系中的内容,则需要卸载记录:

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