Knockout自定义绑定更新未触发

Cit*_*rus 16 javascript jquery custom-binding knockout.js

使用以下代码,我希望每次更新viewModel.item observable时都会执行更新函数.我可以看到我的init和更新函数按照预期在页面加载时触发,但是当我单击我的按钮更新observable的值时则不会.

标记:

<button id='addButton'>item++</button>
<br/>
<span>viewModel.item = </span>
<span data-bind='text: $data.item(), bind: viewModel.item'></span>
Run Code Online (Sandbox Code Playgroud)

脚本:

$(document).ready(function() {
    $('#addButton').click(function() {
        viewModel.item(viewModel.item() + 1);
    });    
    var viewModel = {
        item: ko.observable(1)
    };        
    ko.bindingHandlers.bind = {
        init: function(element, valueAccessor) {
            alert('init');
        },
        update: function(element, valueAccessor) {
            alert('update');
        }  
    };        
    ko.applyBindings(viewModel);
}); 
Run Code Online (Sandbox Code Playgroud)

我浏览了一些类似的问题,但没有找到类似的例子.我在这里创建了一个JSFiddle .

Mic*_*est 29

update每当有约束力的处理程序的功能将运行它访问观测被更新.您的函数不访问任何可观察对象.

这是一个可以使用的更新版本:

ko.bindingHandlers.bind = {
    init: function(element, valueAccessor) {
        alert('init');
    },
    update: function(element, valueAccessor) {
        ko.unwrap(valueAccessor());
        alert('update');
    } 
};        
Run Code Online (Sandbox Code Playgroud)

http://jsfiddle.net/vMD74/14/

  • valueAccessor()只返回设置为绑定的值(它是在绑定中包装表达式的计算值).因此valueAccessor()实际上并不访问observable,因此不会创建依赖项.valueAccessor()()获取绑定的值并访问observable,从而创建依赖项.如果unwrap()的参数只是一个普通的旧对象,则ko.unwrap()返回一个de-refernced observable或文本对象本身. (2认同)