基于最大值的knockout observables依赖项

时间:2013-11-11 20:53:29

标签: javascript knockout.js

我需要观察ab

viewModel.a = ko.observable(25);
viewModel.b = ko.observable(25);

他们的总和等于50.更改a影响b,更改b会影响a。所以显示的金额永远不会超过50。

viewModel.a.subscribe(function(value){
    viewModel.b(50 - value);
});
viewModel.b.subscribe(function(value){
    viewModel.a(50 - value);
});

http://jsfiddle.net/5nq9g/
有没有办法在淘汰赛中简化这种逻辑?

1 个答案:

答案 0 :(得分:2)

我认为您的方法很好,但您可以将其中一个计算出来:

viewModel.b = ko.computed({
    read: function() {
        return 50 - viewModel.a();
    },
    write: function(value) {
        viewModel.a(50 - value);
    }
});

http://jsfiddle.net/ybeQm/

您还可以创建一个函数,该函数返回订阅的新函数,因此您的逻辑只定义一次:

function createMaxFilter(restValueObservable) {
    return function(value) {
        restValueObservable(50 - value);
    };
}
viewModel.a.subscribe(createMaxFilter(viewModel.b));
viewModel.b.subscribe(createMaxFilter(viewModel.a));

http://jsfiddle.net/T4Hh3/