Knockout.js KnockoutJS-如何从计算的可观察对象中排除可观察对象

Knockout.js KnockoutJS-如何从计算的可观察对象中排除可观察对象,knockout.js,Knockout.js,我有一个计算的observable,它使用ko.toJS()从视图模型中发布值(内部observable)。其中一个内部观察值绑定到一个文本框。如何防止对文本框的更改自动触发计算的可观测值(即回发) Knockout 2.2+包括一个peek功能,无需订阅即可访问可观察对象。因此,您可以执行以下操作: ko.computed(function () { var s = self.SearchParams; NS.post({ url: '/SomeUrl',

我有一个计算的observable,它使用ko.toJS()从视图模型中发布值(内部observable)。其中一个内部观察值绑定到一个文本框。如何防止对文本框的更改自动触发计算的可观测值(即回发)


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 });
如果您仍停留在淘汰2.1.0上,您可以手动扩展observables以添加
peek
,如下所示(感谢Ryan Niemeyer):

然后使用
backdoorObservable
查看
OrderNumber

OrderNumber: backdoorObservable()

我写了这个小插件来帮助我解决很多类似的问题:

要忽略某些字段,它为您提供了
隐藏
选项,您可以这样使用:

ko.watch(SearchParams, { hide: [SearchParams.OrderNumber] }, function () {
    NS.post({
        url: '/SomeUrl',
        data: ko.toJS(SearchParams)
    });
}).extend({ throttle: 1 });

几个问题:请求中是否需要发送OrderNumber?它是否需要是可观察的(您可以将一个不可观察的对象绑定到一个输入,它将写入该属性,它只是不会通知任何人,比如您的计算机)?OrderNumber确实需要在请求中发送。我假设它需要是可观察的,以便将其绑定到输入。如果是不可观察的,我可以看到会发生什么。是的,如果你的情况不太复杂(其他事情取决于
OrderNumber
),那么你应该没事。这确实解决了依赖性问题。但是我有一个reset()函数来清除OrderNumber,它现在不会更新文本框。所以,我想我还是希望它是可观察的。一旦在计算中,我可以检查哪些观测触发了计算吗?
OrderNumber: backdoorObservable()
ko.watch(SearchParams, { hide: [SearchParams.OrderNumber] }, function () {
    NS.post({
        url: '/SomeUrl',
        data: ko.toJS(SearchParams)
    });
}).extend({ throttle: 1 });