6

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

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

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

}, this)
4

2 回答 2

8

编辑:

我发现了别的东西:Writeable computed observables。

这是一个例子:

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

于 2013-02-28T09:43:43.360 回答
1

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

  • 创建一个隐藏的可观察对象来存储该值。
  • 根据隐藏的 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博客。

于 2017-09-07T17:32:45.400 回答