在applyBindings上敲击点击绑定
最近我已经把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用户界面有一个button,点击数据绑定到视图模型中的预览function
<input type="button" name="Preview" id="Preview" class="btnPreview" data-bind="click: Report.preview('url/to/report')" />
在$(document).ready()函数中执行以下行时调用问题预览方法
ko.applyBindings(Report, document.body);
即没有用户点击预览button预览function被触发。 什么可能是这种行为的原因? 当我在HTML页面中查看模型JavaScript时,整个工作都很好。
原因是,你的确在调用预览函数(因为编写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() { // ... } }
另一个解决scheme是使用“绑定”构造:
data-bind="click: Report.preview.bind($data, 'url/to/report')"
其中bind()的第一个参数将成为被调用函数中的“this”。