Knockout在applyBindings上触发点击绑定

时间:2012-04-12 08:07:55

标签: javascript knockout.js

最近我将ViewModel分离为一个单独的JavaScript文件。

var Report = (function($) {
    var initialData = [];
    var viewModel = {
        reports: ko.observableArray(initialData),
        preview: function(path) {
            // preview report
        },
        otherFunctions: function() {}
    };
    return viewModel;
})(jQuery);​

这是HTML和Knockout相关的代码

<script type="text/javascript" src="path/to/report/javascript"></script>
<script type="text/javascript">
    $(document).ready(function () {
        ko.applyBindings(Report, document.body);
    });
</script>

HTML用户界面有一个按钮,在该按钮上,数据绑定到视图模型中的预览功能

<input type="button" name="Preview" id="Preview" class="btnPreview" 
    data-bind="click: Report.preview('url/to/report')" />
在$(document).ready()函数中执行以下行时,将调用

问题预览方法

ko.applyBindings(Report, document.body); 

即没有用户点击预览按钮预览功能就会被触发。这种行为可能是什么原因?当我在HTML页面中查看模型JavaScript时,整个工作正常。

2 个答案:

答案 0 :(得分:84)

原因是,你确实正在调用预览功能(因为写functionName意味着引用该函数,写functionName()意味着调用它。)

所以data-bind="click: Report.preview"将按预期工作,但不会移交参数。

the manual所述(关于其他主题,但仍然适用):

  

如果需要传递更多参数,一种方法是将处理程序包装在一个接受参数的函数文本中,如下例所示:

<button data-bind="click: function(data, event) { myFunction(data, event, 'param1', 'param2') }">
    Click me
</button>

或在你的情况下:

data-bind="click: function() { Report.preview('url/to/report') }"

另一个解决方案是使preview()返回一个函数(实际上几乎是相同的东西):

preview: function(path) {
    return function() {
        // ...
    }
}

答案 1 :(得分:22)

另一个解决方案是使用'bind'构造:

data-bind="click: Report.preview.bind($data, 'url/to/report')" 

其中bind()的第一个参数将成为被调用函数中的'this'。