HasChanged在Backbone 1.1.2中不起作用

时间:2014-07-23 15:47:16

标签: backbone.js

CodePen http://codepen.io/opnsrce/pen/hclaH

预期行为:您应该只能一次突出显示一个项目。

当前行为:您可以突出显示多个项目

原因:在change事件期间,当控制器检查时,HasChanged返回true。

当我使用Backbone 0.9.2运行此代码时,它可以工作。当我使用1.1.2时它没有。

hasChanged在这两个版本之间的工作方式是否发生了根本性的变化?

1 个答案:

答案 0 :(得分:1)

我相信这是所需的功能。每次模型本身为changed时,模型的set属性都会更改。因此,在您多次set模型之前,它将保留其更改。如果在选择其他模型时清除了更改的哈希值,那么您在此处设置的代码将起作用。实际发生的情况是,只要您将模型设置为isSelected,它就会始终为isSelected == truehasChanged('isSelected'),因此它永远不会通过条件将isSelected设置为false

实现目标的一种方法是将收集方法更改为:

onSelectedChanged: function(modelActive) {
  if(modelActive.get('isSelected') === true){
    this.each(function(model) {
      if (model != modelActive) {
        model.set({isSelected: false});
      }
    });
  }
}

请注意,我取出了hasChanged,因为这只是确认某个模型在之前的某个时刻发生了变化。相反,我将主动选择的模型与正在迭代的模型进行比较。我们不想触及活动的那个。我还检查了这个方法是否是通过isSelectedtrue的设置触发的,因为如果我们不这样做,迭代模型到false的每个设置都会触发此方法并导致问题。

唯一的限制是您无法选择相同的项目来切换它。