Knockout在applyBindings上触发点击绑定

Raj*_*Raj 59 javascript knockout.js

最近我将ViewModel分离为一个单独的JavaScript文件.

var Report = (function($) {
    var initialData = [];
    var viewModel = {
        reports: ko.observableArray(initialData),
        preview: function(path) {
            // preview report
        },
        otherFunctions: function() {}
    };
    return viewModel;
})(jQuery);?
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

HTML用户界面有一个按钮,在该按钮上,数据绑定到视图模型中的预览功能

<input type="button" name="Preview" id="Preview" class="btnPreview" 
    data-bind="click: Report.preview('url/to/report')" />
Run Code Online (Sandbox Code Playgroud)

当以下行在$(document).ready()函数中执行时,将调用问题预览方法

ko.applyBindings(Report, document.body); 
Run Code Online (Sandbox Code Playgroud)

即没有用户点击预览按钮预览功能就会被触发.这种行为可能是什么原因?当我在HTML页面中查看模型JavaScript时,整个工作正常.

Nik*_*iko 85

原因是,你确实正在调用预览函数(因为写入functionName意味着指向函数,写入functionName()意味着调用它).

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

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

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

<button data-bind="click: function(data, event) { myFunction(data, event, 'param1', 'param2') }">
    Click me
</button>
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下:

data-bind="click: function() { Report.preview('url/to/report') }"
Run Code Online (Sandbox Code Playgroud)

另一个解决方案是使preview()返回一个函数(实际上几乎相同):

preview: function(path) {
    return function() {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我花了一分钟才得到这个答案.我需要澄清:这是因为你用`()`调用`Report.preview`它执行调用而不是返回函数指针.没有括号,它将按预期工作. (7认同)

Rem*_*Ros 23

另一种解决方案是使用'bind'结构:

data-bind="click: Report.preview.bind($data, 'url/to/report')" 
Run Code Online (Sandbox Code Playgroud)

其中bind()的第一个参数将成为被调用函数中的'this'.