Ember计算得恰当,没有在财产变更上解雇

时间:2016-03-11 13:54:39

标签: javascript ember.js

我有一个奇怪的问题,即计算属性在其依赖属性发生变化时不会触发。

计算属性和操作

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.questionAnswersvariant.questionAnswers.@each.positionvariant.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());
  }
}

有关如何使其发挥作用的任何想法?

1 个答案:

答案 0 :(得分:1)

variant.questionAnswers.@each.position是您创建的计算属性的正确依赖键。我之所以这么说是因为position是你在每个数组项中改变的实际值。所以仅仅观察数组项是不够的。

我不清楚的部分..在你的问题中:动作中是answerModels数组,实际上是你在计算属性中比较的同一个variant.questionAnswers数组?

当我仔细观察你的行动时...看起来你的代码看起来不会改变整体排序顺序吗?你正在通过+1增加所有项目的位置,所以也许这就是你在视觉上看不到排序顺序的变化的原因。