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