在下面的代码中,我们的想法是,如果你填写'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);
答案 0 :(得分:2)
您的validateCss
绑定会创建对vm.name.isValid
的依赖关系。当您在字段中写入“test”时,errors
会更新,这会导致isValid
更新,从而触发输入data-bind
属性中的所有绑定以进行重新评估。因此,再次评估value
绑定并使用name
中的值替换当前值(存储在underlying
中)。
因此,基本上value
绑定基于isValid
更改而再次运行。
有几种方法可以处理它。您可以让underlying
每次都更新,如有必要,可以在其他地方存储一个干净值,只有在有效时才会更新。
您还可以将自定义绑定放在其他元素上。例如,您可以将input
包装在span或div中并将绑定放在其上。我假设您希望validateCss
绑定在值无效时分配CSS类。