Javascript NotifySubscribers未刷新UI(可写计算)

Javascript NotifySubscribers未刷新UI(可写计算),javascript,knockout.js,Javascript,Knockout.js,我在自定义绑定中有一个可写的计算程序来格式化一个可观察的。但是,当用户删除格式化的掩码时,读取函数不会触发,因为observable正在删除所有非数字,好吧,它的工作方式应该是这样的,所以我添加了notifySubcribers来调用read everytime,即使observable值没有改变,它也没有工作,但是ui元素没有刷新新值(读取返回) 请遵循以下代码: ko.bindingHandlers.conta = { init : function(element, valueAc

我在自定义绑定中有一个可写的计算程序来格式化一个可观察的。但是,当用户删除格式化的掩码时,读取函数不会触发,因为observable正在删除所有非数字,好吧,它的工作方式应该是这样的,所以我添加了notifySubcribers来调用read everytime,即使observable值没有改变,它也没有工作,但是ui元素没有刷新新值(读取返回)

请遵循以下代码:

ko.bindingHandlers.conta = {
    init : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var observable = valueAccessor(), formatted = ko.computed({
        read : function() {
            var val = ko.unwrap(valueAccessor());
            if (!val) return val;
            if (val.toString().length < 6) { 
                val =  zeroPad(val, 6);
                observable(val);
            }
            return val.toString().slice(0, val.toString().length - 1) + "-" + val.toString().slice(val.toString().length - 1);
        },
        write : function(value) {

            if (value) {
                value = zeroPad(value, 6);
            }

            observable(value.replace(/\D/g, ''));
            observable.notifySubscribers();
        }
    });

        if ($(element).is('input')) {
            ko.applyBindingsToNode(element, {
                numbersOnly : true,
                maxLength : 10,
                value : formatted
            });
        } else {
            ko.applyBindingsToNode(element, {
                numbersOnly : true,
                text : formatted
            });
        }

        return {
            controlsDescendantBindings : true
        };
    }
};
ko.bindingHandlers.conta={
init:function(元素、valueAccessor、allBindingsAccessor、viewModel、bindingContext){
var observable=valueAccessor(),格式化=ko.computed({
读:函数(){
var val=ko.unwrap(valueAccessor());
如果(!val)返回val;
如果(val.toString().length<6){
val=zeroPad(val,6);
可观察(val);
}
返回val.toString().slice(0,val.toString().length-1)+“-”+val.toString().slice(val.toString().length-1);
},
写入:函数(值){
如果(值){
值=zeroPad(值6);
}
可观察(值。替换(/\D/g,);
可观察的;
}
});
if($(元素).is('input')){
ko.applyBindingsToNode(元素{
仅数字:正确,
最大长度:10,
值:格式化
});
}否则{
ko.applyBindingsToNode(元素{
仅数字:正确,
文本:格式化
});
}
返回{
ControlsDescentBindings:true
};
}
};
有人能给我指路吗


谢谢:D

使用
通知:始终
扩展
格式的
计算obs:

ko.bindingHandlers.conta = {
    init : function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
        var observable = valueAccessor(), formatted = ko.computed({
            ...
        }).extend({ notify: 'always' });
...

这将迫使它始终通知,即使没有更改。

您可以扩展代码并将其制作成一个小程序吗?编辑器工具栏上有一个“Stack Snippet”按钮,甚至可以让它在SO上运行。嘿,我做了一个例子:如果你删除“-”,敲除将调用read方法。。但是返回值并没有更新元素=(