Knockout.js:自定义绑定重置值

时间:2011-10-10 20:04:07

标签: javascript knockout.js

在下面的代码中,我们的想法是,如果你填写'test',这被认为是无效的,不应该将值写入observable。我遇到的问题是我的自定义绑定以某种方式重置了observable的值。

以下代码的工作版本: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);

1 个答案:

答案 0 :(得分:2)

您的validateCss绑定会创建对vm.name.isValid的依赖关系。当您在字段中写入“test”时,errors会更新,这会导致isValid更新,从而触发输入data-bind属性中的所有绑定以进行重新评估。因此,再次评估value绑定并使用name中的值替换当前值(存储在underlying中)。

因此,基本上value绑定基于isValid更改而再次运行。

有几种方法可以处理它。您可以让underlying每次都更新,如有必要,可以在其他地方存储一个干净值,只有在有效时才会更新。

您还可以将自定义绑定放在其他元素上。例如,您可以将input包装在span或div中并将绑定放在其上。我假设您希望validateCss绑定在值无效时分配CSS类。