【问题标题】:Ember computed properly not firing on property changeEmber 计算正确,不会在属性更改时触发
【发布时间】:2016-03-11 13:54:38
【问题描述】:

我遇到了一个奇怪的问题,即计算属性在其依赖属性更改时没有触发。

计算属性和动作

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 是所有答案的数组,设置位置在该动作中正常工作。我可以在 ember 检查器中以及检查单个模型时看到位置发生变化。

但是,它不会更新视图顺序,因为 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());
  }
}

关于如何让它发挥作用的任何想法?

【问题讨论】:

    标签: javascript ember.js


    【解决方案1】:

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

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

    当我仔细观察您的操作时.. 看起来您的代码不会做任何事情来改变整体排序顺序?您将所有项目的位置增加+1,所以也许这就是您在视觉上看不到排序顺序变化的原因。

    【讨论】:

    • variant.questionAnswers.@each.position 对我不起作用。将调试器放在计算属性中时,它不会触发。 answerModels 以新排序的顺序进入操作。所以我只是遍历它们并根据它们的新顺序设置它们的位置属性。
    • 如果 answerModelsvarient.questionAnswers 不是同一个数组,这就是您的计算属性未触发的原因。
    • 但我正在更改实际模型。这意味着观察这些模型的任何计算属性也应该触发。
    猜你喜欢
    • 1970-01-01
    • 2014-07-22
    • 2018-02-25
    • 2014-04-06
    • 2012-08-04
    • 2015-05-24
    • 2021-01-27
    • 2016-04-06
    • 2017-04-02
    相关资源
    最近更新 更多