EmberJS:如何从hasMany关联中移除对象后重新推送?
解决Ember Data pushPayload后反向关联未同步的问题
这个问题我之前也碰到过!Ember Data的pushPayload确实不会自动帮你同步双向关联的两边,因为它只是把你提供的数据直接存入store,不会主动遍历关联去维护反向引用的一致性——这是出于性能考量,避免不必要的遍历操作。下面给你几个可行的解决办法:
1. 推送数据时直接包含双向关联信息
在推送模型数据的时候,同时把反向关联的ID也带上。比如推送folder时,顺便把它关联的item ID加到items数组里:
this.get('store').pushPayload({ folder: { id: 1, name: 'My folder', items: [2] // 添加上反向关联的item ID } }); this.get('store').pushPayload({ item: { id: 2, name: 'My item', parentFolder: 1 } });
这样store在处理数据时,会同时建立两边的关联关系,不用后续手动调整。
2. 手动维护反向关联
如果没办法在推送数据时就带上完整的关联信息,那可以在push完成后,手动把关联对象添加到反向关联的集合里:
this.get('store').pushPayload({ folder: { id: 1, name: 'My folder' } }); this.get('store').pushPayload({ item: { id: 2, name: 'My item', parentFolder: 1 } }); const folder = this.get('store').peekRecord('folder', 1); const item = this.get('store').peekRecord('item', 2); // 手动将item添加到folder的items集合中 folder.get('items').pushObject(item);
执行完这一步后,folder的items数组里就会包含这个item,双向关联就同步了。
3. 确保模型关联的inverse设置正确
首先检查你的模型定义,确认双向关联的inverse属性已经正确配置,这是双向关联正常工作的基础:
// app/models/folder.js
import Model, { hasMany } from '@ember-data/model'; export default class FolderModel extends Model { @hasMany('item', { inverse: 'parentFolder' }) items; }
// app/models/item.js
import Model, { belongsTo } from '@ember-data/model'; export default class ItemModel extends Model { @belongsTo('folder', { inverse: 'items' }) parentFolder; }
如果inverse设置错误或者缺失,Ember Data可能无法正确识别双向关联,导致同步失败。
内容的提问来源于stack exchange,提问作者Charles
相关产品推荐
相关产品推荐

