淘汰赛射击点击applyBindings结合(Knockout firing click bindi

2019-06-23 13:58发布

最近,我分离出来视图模型到一个单独的JavaScript文件。

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

下面是HTML和淘汰赛相关的代码

<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')" />

问题预览方法被调用时,下面的行执行在$(文件)。就绪()函数

ko.applyBindings(Report, document.body); 

这是没有的预览按钮预览功能用户点击被激发。 有什么能为这种现象的原因是什么? 整个东西是工作的罚款时,我会在HTML页面本身查看模型的JavaScript。

Answer 1:

其原因是,你确实调用预览功能(因为写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: function(path) {
    return function() {
        // ...
    }
}


Answer 2:

另一个解决方案是使用“绑定”构建体:

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

其中,所述第一参数结合()将成为“这个”在调用的函数。



文章来源: Knockout firing click binding on applyBindings