Knockoutjs foreach绑定中的方法按顺序被调用两次

时间:2017-02-01 06:12:47

标签: knockout.js

即使绑定的结果看起来没问题,setEnabled也会在场景后顺序调用两次。您可以在浏览器的控制台中查看它。我该如何避免这种行为?

createSubList

https://jsfiddle.net/7eL2ur8o/2/

1 个答案:

答案 0 :(得分:1)

这种情况可能有很多原因。最有可能的是,在这种情况下,它会在创建绑定时计算一次以获取初始值,第二次在实际绑定DOM时计算它。意识到KO可用于变更跟踪,并且通过重新评估可观察的属性来了解某些事情发生变化的方法。

要了解为什么在特定情况下它会发生两次,它可能最容易加载未公开的KO版本并设置断点。

但更重要的是要点。您有一个以绑定中使用的create...开头的方法名称。您应该意识到您正在使用比较编程风格,其中Knockout的绑定通常用于声明性样式。

换句话说,您应该努力使您的可观察属性免于副作用,并且最好甚至在相同的上下文中给出相同的结果。这是代码的KO风格版本:



function VM(){
  var self = this;
  var list1Input = [1, 2, 3, 4, 5];
  
  function createSubList(index){
        // this method gets called once
        console.log(index);
        return ['Sub1'];
  }
  
  self.list1 = list1Input.map(function(i){
    return {
      label: i,
      subItems: createSubList(i)
    };
  });
}

ko.applyBindings(new VM())

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.0/knockout-min.js"></script>

<section>
<!-- ko foreach : list1 -->
   <div data-bind='text: $data.label'></div>

    <!-- ko foreach : subItems -->    
      <div data-bind='text: $data'></div>
    <!-- /ko -->
 <!-- /ko -->
</section>
&#13;
&#13;
&#13;

相关问题