拒绝可观察到的价值变化

时间:2013-02-28 09:36:47

标签: knockout.js

有没有办法拒绝/取消修改可观察价值? 像这样:

observable.subscribe (function (newvalue) {
   if ( newvalue < 0 ) {

        // cancel changing
   }
   else{ 
        // proceed with change
   }

}, this)

2 个答案:

答案 0 :(得分:8)

编辑:

我发现了其他东西:可写的计算可观察量。

以下是一个例子:

function AppViewModel() {
    this.field = ko.observable("initValue");
    this.computedField = ko.computed({
        read: function () {
            return this.field();
        },
        write: function (value) {
            if(value > 0) {
                this.field(value);
            }
        },
        owner: this
    });
}

然后你绑定到计算字段。

/编辑

我会使用自定义绑定。

以下是自定义绑定的教程: http://learn.knockoutjs.com/#/?tutorial=custombindings

或者这里是文档: http://knockoutjs.com/documentation/custom-bindings.html

答案 1 :(得分:0)

为了帮助拒绝写入值,我使用了以下内容:

  • 创建一个存储值的隐藏observable。
  • 根据隐藏的observable返回一个可写的计算observable。
  • 当某些内容写入计算出的observable时,请在接受之前对其进行验证。

我用这段代码扩展了Knockout:

ko.conditionedObservable = function (initialValue, condition) {
    var obi = ko.observable(initialValue);
    var computer = ko.computed({
        read: function () { return obi(); },
        write: function (newValue) {
            //unwrap value - just to be sure
            var v = ko.unwrap(newValue);
            //check condition
            if (condition(v)) {
                //set it to the observable
                obi(v);
            }
            else {
                //reset the value
                computer.notifySubscribers();
            }
        }
    });
    return computer;
};

在像这样的对象中使用它:

field = ko.conditionedObservable<number>(null, (v) => parseInt(v) > 0);

有关详细说明,请查看我的Conditioning Knockout Observables: reject values博客。