4

ko.toJS()を使用してビューモデルから値(内部オブザーバブル)を投稿する計算されたオブザーバブルがあります。内部オブザーバブルの1つがテキストボックスにバインドされています。テキストボックスへの変更が計算されたオブザーバブル(つまりポストバック)を自動的にトリガーしないようにするにはどうすればよいですか?

function viewModel() {
    var self = this;
    self.SearchParams = {
        OrderStatusID: ko.observable(),
        OrderNumber: ko.observable(), // I don't want this observable to trigger the postback
        OrderBy: ko.observable(),
        OrderByDirection: ko.observable(),
        PageIndex: ko.observable(),
        PageSize: ko.observable()
    };

    // This computed observable automatically subscribes to every
    // observable in self.SearchParams. How can I ignore changes to
    // self.SearchParams.OrderNumber?
    ko.computed(function () {
        NS.post({
            url: '/SomeUrl',
            data: ko.toJS(self.SearchParams)
        });
    }).extend({ throttle: 1 });
}
4

2 に答える 2

14

Knockout 2.2+には、peekサブスクライブせずにオブザーバブルにアクセスする機能が含まれています。したがって、次のことができます。

ko.computed(function () {
    var s = self.SearchParams;
    NS.post({
        url: '/SomeUrl',
        data: {
            OrderStatusID: s.OrderStatusID(), 
            OrderNumber: s.OrderNumber.peek(),
            OrderBy: s.OrderBy(),
            OrderByDirection: s.OrderByDirection(),
            PageIndex: s.PageIndex(),
            PageSize: s.PageSize()
        }
    });
}).extend({ throttle: 1 });

Knockout 2.1.0に固執している場合は、オブザーバブルを手動で拡張して、次peekのように追加できます(Ryan Niemeyerに感謝)。

var backdoorObservable = function(initialValue) {
    var _value = initialValue,
        result = ko.observable(initialValue);

    result.peek = function() { return _value; };

    result.subscribe(function(newValue) {
        _value = newValue;
    });

    return result;
};

そして、以下のために使用backdoorObservableOrderNumberます:

OrderNumber: backdoorObservable()
于 2012-07-19T03:43:38.273 に答える
0

私はこの小さなプラグインを作成して、多くの同様の状況で私を助けてくれました。

https://github.com/ZiadJ/knockoutjs-reactor

特定のフィールドを無視するために、次のhideように使用できるオプションが提供されます。

ko.watch(SearchParams, { hide: [SearchParams.OrderNumber] }, function () {
    NS.post({
        url: '/SomeUrl',
        data: ko.toJS(SearchParams)
    });
}).extend({ throttle: 1 });
于 2012-11-07T23:57:57.387 に答える