最近,我将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')" />
在$().ready()函数中执行以下行时,将调用Problem预览方法
ko.applyBindings(Report, document.body);
也就是说,不需要用户点击预览按钮,就会触发预览功能。导致这种行为的原因可能是什么?当我在超文本标记语言页面本身中查看模型JavaScript时,整个东西都工作得很好。
发布于 2012-04-12 16:18:38
原因是,您实际上是在调用预览函数(因为编写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: function(path) {
return function() {
// ...
}
}
发布于 2012-10-05 20:33:42
另一种解决方案是使用“bind”结构:
data-bind="click: Report.preview.bind($data, 'url/to/report')"
其中绑定()的第一个参数将成为被调用函数中的'this‘。
https://stackoverflow.com/questions/10119767
复制相似问题