Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/427.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何侦听此自定义bindingHandler中的数据更改?_Javascript_Knockout.js - Fatal编程技术网

Javascript 如何侦听此自定义bindingHandler中的数据更改?

Javascript 如何侦听此自定义bindingHandler中的数据更改?,javascript,knockout.js,Javascript,Knockout.js,我有一个自定义bindingHandler,在被单击时可以很好地工作。它成功地更改了数据点。。但当另一个ui控件更改数据时,它不会被更新 我的html看起来像这样 <input type="checkbox" data-bind="checked: publisher.my_check"> Checkbox <div data-bind="slidebox: {label_on: 'ON', label_off: 'OFF', data: publisher.my_check

我有一个自定义bindingHandler,在被单击时可以很好地工作。它成功地更改了数据点。。但当另一个ui控件更改数据时,它不会被更新

我的html看起来像这样

<input type="checkbox" data-bind="checked: publisher.my_check"> Checkbox
<div data-bind="slidebox: {label_on: 'ON', label_off: 'OFF', data: publisher.my_check }"></div>
ko.bindingHandlers.slidebox = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {


        var el = $(element),
            obj = valueAccessor();
        //add additional markup
        el.append($('<div>'));
        //set initial label
        el.find('div').text(el.hasClass('checked') ? obj.label_on : obj.label_off);
        //update the data point
        obj.data(el.hasClass('checked'));



        var updateHandler = function() {  
            console.log('i got clicked');   
            var el = $(element),
                obj = valueAccessor();
            el.toggleClass('checked').find('div').text(el.hasClass('checked') ? obj.label_on : obj.label_off);
            obj.data(el.hasClass('checked'));       

        };
        ko.utils.registerEventHandler(element, "click", updateHandler);

    },
    'update': function (element, valueAccessor) {
        console.log('i got updated');
    }
};
复选框
我的bindingHandler看起来像这样

<input type="checkbox" data-bind="checked: publisher.my_check"> Checkbox
<div data-bind="slidebox: {label_on: 'ON', label_off: 'OFF', data: publisher.my_check }"></div>
ko.bindingHandlers.slidebox = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {


        var el = $(element),
            obj = valueAccessor();
        //add additional markup
        el.append($('<div>'));
        //set initial label
        el.find('div').text(el.hasClass('checked') ? obj.label_on : obj.label_off);
        //update the data point
        obj.data(el.hasClass('checked'));



        var updateHandler = function() {  
            console.log('i got clicked');   
            var el = $(element),
                obj = valueAccessor();
            el.toggleClass('checked').find('div').text(el.hasClass('checked') ? obj.label_on : obj.label_off);
            obj.data(el.hasClass('checked'));       

        };
        ko.utils.registerEventHandler(element, "click", updateHandler);

    },
    'update': function (element, valueAccessor) {
        console.log('i got updated');
    }
};
ko.bindingHandlers.slidebox={
init:函数(元素、valueAccessor、allBindingsAccessor、viewModel){
变量el=$(元素),
obj=值访问器();
//添加附加标记
el.追加($('');
//设置初始标签
el.find('div').text(el.hasClass('checked')?对象标签打开:对象标签关闭);
//更新数据点
对象数据(el.HASSCLASS(‘已检查’);
var updateHandler=函数(){
log(“我被点击了”);
变量el=$(元素),
obj=值访问器();
el.toggleClass('checked').find('div').text(el.hasClass('checked'))?对象标签打开:对象标签关闭);
对象数据(el.HASSCLASS(‘已检查’);
};
元素“click”,updateHandler;
},
“更新”:函数(元素、valueAccessor){
log(“我得到了更新”);
}
};

单击div时,它会更改数据点,复选框会按预期更新。。但是,当单击复选框时,我没有看到实现更新功能所需的“我已更新”控制台消息。当数据绑定属性上绑定到的任何可观察对象被更新时,将调用此函数。在本例中,
publisher.my\u check

ko.bindingHandlers.slidebox = {
    init: function(element, valueAccessor, allBindingsAccessor, viewModel) {
        ...
    },
    'update': function (element, valueAccessor) {
        var config = valueAccessor(),
            checked = ko.utils.unwrapObservable(config.data),
            $element = $(element).toggleClass('checked', checked);

        $element.find('div').text(checked ? config.label_on : config .label_off);           
    }
};
编辑

这里有一个工作代码的小提琴


希望这有帮助。

我的控制台日志是否至少应该触发?说明:日志在启动时触发,但在单击复选框Yes时不会触发。应该触发。我在一个JSFIDLE中运行了这个(请参见编辑),它运行得很好。没有看到你的出版商。我的检查代码,我不能帮助进一步。哇。。明白了。。只要一个console.log就不会启动。。你是对的,我确实需要实现更新代码。。。但是,只有一个console.log,就没有日志记录,也不知道发生了什么。这个版本有一个控制台日志,每次都会触发。