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