在渲染jquery模板时,knockout.js调用click事件

时间:2011-08-10 19:34:26

标签: knockout.js jquery-templates

为什么在模板渲染时会为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>

1 个答案:

答案 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/