开发者

Knockout.js: Custom binding resetting the value

In the following code the idea is that if you fill in 'test' that this is considered invalid and shouldn't write the value to the observable. The problem I have is that my custom binding is somehow resetting the observable's value.

A working version of the code below: http://jsfiddle.net/6hcpM/1/

var underlying = ko.observable('foo');
var errors = ko.observableArray()
var isValid = ko.dependentObservable(function(){
    return errors().length === 0
});

var vm = {
    name : ko.dependentObservable({
        read : underlying,开发者_如何学运维
        write : function(value){
            errors([]);

            if(value==='test'){
             errors([ 'Cant be test matey' ]);   
            };

            if(isValid()){
              underlying(value);
            };
        }
    })
};

vm.name.isValid = isValid;

ko.bindingHandlers.validateCss = {
    update: function(element, valueAccessor) {
       observable = valueAccessor();
       observable.isValid(); //this somehow causes the problem
    }
};

ko.applyBindings(vm);


Your validateCss binding creates a dependency to vm.name.isValid. When you write "test" to the field, errors is updated, which causes isValid to update, which triggers all of the bindings in the input's data-bind attribute to be re-evaluated. So, the value binding gets evaluated again and replaces the current value with the value from name (which is stored in underlying).

So, basically the value binding is running again based on isValid changing.

There are several ways that you could handle it. You could let underlying get updated every time and, if necessary, store a clean value elsewhere that only gets updated when it is valid.

You could also put your custom binding on a different element. For example, you could wrap your input in a span or div and put the binding on it. I assume that you want the validateCss binding to assign a CSS class when the value is invalid.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜