为什么在模板渲染时会为showFlawDetails触发点击?
app.viewModel.caseStudy.showFlawDetails = function (index) {
console.log(index);
app.viewModel.caseStudy.selectedFlaw(index);
};
<script id="flawTemplate" type="text/html">
{{each(index, value) $data}}
<div class="flaw">
<div class="Title" data-bind="click: app.viewModel.caseStudy.showFlawDetails(index)"> Flaw: ${value.Title} </div>
<div class="Items" data-bind="visible: app.viewModel.caseStudy.selectedFlaw() == index">
<div>Title: <input type="text" data-bind="value: value.Title" /></div>
<div>Check: <input type="text" data-bind="value: value.Check" /></div>
{{each(index1, value1) value.Details}}
<div>${value1.Key}: <input type="text" data-bind="value: value1.Value" /></div>
{{/each}}
</div>
</div>
{{/each}}
</script>
答案 0 :(得分:4)
点击(和事件)绑定期望您传递对函数的引用,而不是对它的实际评估。
因此,在您的情况下,它会尝试将click事件设置为app.viewModel.caseStudy.ShowFlawDetails(index)
的结果。
要完成这项工作,您需要将其包装在匿名函数中,如:
click: "function() { app.viewModel.caseStudy.showFlawDetails(index); }"
或者如果您不喜欢匿名函数,那么您需要找到一种方法将函数移动到caseStudy对象并在caseStudy对象上放置索引,以便您可以直接访问它。如果它有助于在我的this post中查看事件绑定中的避免匿名函数。
此外,这里是通过订阅对其父observableArray的更改来维护对象的索引属性的示例:http://jsfiddle.net/rniemeyer/CXBFN/