61

最近我将 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 时,整个工作正常。

4

2 回答 2

87

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

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

正如手册所述(关于不同的主题,但这仍然适用):

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

<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() {
        // ...
    }
}
于 2012-04-12T08:18:38.480 回答
24

另一种解决方案是使用“绑定”构造:

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

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

于 2012-10-05T12:33:42.053 回答