解决方案是不与基本阵列存储的关系作斗争。
例如
基础
export default Model.extend({
title: attr('string'),
visionOptions: hasMany('vision-option'),
});
基本选项
export default Model.extend({
title: attr('string'),
vision: belongsTo('vision'),
});
保存选定对象的模型
export default Model.extend({
//...
visionOptions: hasMany('vision-option', {async: true}),
//...
});
要处理保存和选择正确对象的组件
export default Component.extend({
tagName: "",
classNames: "",
selectedVisions: computed('dashboardItem.visionOptions', function () {
const visionId = this.get('vision.id');
const options = this.get('dashboardItem.visionOptions');
return options.filterBy('vision.id', visionId);
}),
actions: {
addVision(newList) {
let dashboardItem = get(this, 'dashboardItem');
let options = get(this, 'selectedVisions');
options.forEach(function (me) {
if (!newList.includes(me)) {
dashboardItem.get('visionOptions').removeObject(me);
}
});
newList.forEach(function (me) {
if (!options.includes(me)) {
dashboardItem.get('visionOptions').pushObject(me);
}
});
dashboardItem.save().then(() => {
dashboardItem.notifyPropertyChange('visionOptions')
});
}
}
});
用于渲染power select的模板
{{#power-select-multiple
placeholder=""
options=vision.visionOptions
searchEnabled=false
selected=selectedVisions
onchange=(action 'addVision') as |vision|}}
{{vision.title}}
{{/power-select-multiple}}
这允许存在未知数量的“Vision”,并加载和保存未知数量的“visionObjects”。
这个
notifyPropertyChange
需要更新计算属性,以便在用户添加或删除选定对象时呈现前端。这很尴尬,因为没有直接已知的数据库密钥。