我有一个奇怪的问题,即计算属性在其依赖属性发生变化时不会触发。
计算属性和操作
answers: computed('variant.questionAnswers.[]', function() {
return get(this, 'variant.questionAnswers').sortBy('position');
}),
...
actions: {
reorderItems(answerModels) {
answerModels.forEach(function(item, index) {
set(item, 'position', index + 1);
});
}
}
操作中的answerModels
是所有答案的数组,并且设置位置在该操作中正常工作。我可以看到在余烬检查员中以及在检查各个模型时的位置变化。
但是,它不会更新视图顺序,因为answers
计算的属性不会被触发。
我已尝试将相关属性更改为variant.questionAnswers
,variant.questionAnswers.@each.position
,variant.questionAnswers.[]
,但当我更改操作中的位置时,似乎没有任何内容。
我如何解决它是添加一个timeHack
属性,使其工作,但显然不理想...
timeHack: null,
answers: computed('timeHack', 'variant.questionAnswers.[]', function() {
return get(this, 'variant.questionAnswers').sortBy('position');
}),
actions: {
reorderItems(answerModels) {
answerModels.forEach(function(item, index) {
set(item, 'position', index + 1);
});
set(this, 'timeHack', new Date());
}
}
有关如何使其发挥作用的任何想法?
答案 0 :(得分:1)
variant.questionAnswers.@each.position
是您创建的计算属性的正确依赖键。我之所以这么说是因为position
是你在每个数组项中改变的实际值。所以仅仅观察数组项是不够的。
我不清楚的部分..在你的问题中:动作中是answerModels
数组,实际上是你在计算属性中比较的同一个variant.questionAnswers
数组?
当我仔细观察你的行动时...看起来你的代码看起来不会改变整体排序顺序吗?你正在通过+1
增加所有项目的位置,所以也许这就是你在视觉上看不到排序顺序的变化的原因。