如何将字符串默认为null而不是“”

时间:2014-12-03 10:44:06

标签: knockout.js knockout-mapping-plugin

在knockoutjs中,您可以将字符串绑定到输入标记。如果你没有篡改这个输入,字符串仍然是null,但是如果你输入一些内容然后清除它就会转到一个空字符串。如何在不修改每个绑定的情况下全局覆盖此行为。

干杯。

萨姆

2 个答案:

答案 0 :(得分:3)

你可以创建一个" new"包含将空字符串转换为null的计算负责的可观察函数。然后每当你想强制空值时使用它:

JS:

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);

HTML:

<input type="text" data-bind="value: val"/>

Demo: JSFiddle


编辑:


修改forceNullObservable以接受外部可观察量将实现您想要的而无需修改js代码:

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);

HTML:

<input type="text" data-bind="value: forceNullObservable(val)"/>

Demo: 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" />