在knockoutjs中,您可以将字符串绑定到输入标记。如果你没有篡改这个输入,字符串仍然是null
,但是如果你输入一些内容然后清除它就会转到一个空字符串。如何在不修改每个绑定的情况下全局覆盖此行为。
干杯。
萨姆
答案 0 :(得分:3)
你可以创建一个" new"包含将空字符串转换为null的计算负责的可观察函数。然后每当你想强制空值时使用它:
var forceNullObservable = function() {
var obs = ko.observable();
return ko.computed({
read: function() {
return obs();
},
write: function(val) {
if(val === '') {
val = null;
}
obs(val);
}
});
};
// use forceNullObservable instead of ko.observable
vm = {
val: forceNullObservable()
}
ko.applyBindings(vm);
<input type="text" data-bind="value: val"/>
#
JSFiddle
修改forceNullObservable
以接受外部可观察量将实现您想要的而无需修改js代码:
window.forceNullObservable = function(obs) {
return ko.computed({
read: function() {
return obs();
},
write: function(val) {
if(val === '') {
val = null;
}
obs(val);
}
});
};
vm = {
val: ko.observable()
}
ko.applyBindings(vm);
<input type="text" data-bind="value: forceNullObservable(val)"/>
#
JSFiddle
答案 1 :(得分:0)
我认为你不能在全球范围内做到这一点,但你应该可以像这样使用自定义值绑定:
JS
ko.bindingHandlers.nonBlankValue = {
init: function (element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// Subscribe to changes to the observable bound to the value binding:
allBindingsAccessor().value.subscribe(function(newValue) {
if (newValue === "") { this.target(null); }
});
// Initialise the standard underlying KO value binding:
ko.bindingHandlers.value
.init(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext);
}
update: ko.bindingHandlers.value.update
};
标记
<input type="text" data-bind="nonBlankValue: modelProperty" />