KnockoutJS:Observable没有收到通知

时间:2016-05-31 09:13:44

标签: knockout.js typescript observable

在我的ViewModel中,我有以下属性:

logisticsDestinations: KnockoutObservableArray<Destination>;
filteredlogisticsDestinations: KnockoutComputed<Destination[]>;
logisticsDestinationsFilter: KnockoutObservable<string>;
showNotAddressable: KnockoutObservable<boolean>;

在我的构造函数中,我实例化如下:

//Data from back-end, this works
self.logisticsDestinations = ko.observableArray<Destination>(lines); 
self.showNotAddressable = ko.observable<boolean>(true);
self.logisticsDestinationsFilter = ko.observable<string>("");
self.filteredlogisticsDestinations = ko.computed(() => {
    //subscribe to properties
    //self.showNotAddressable();

    var result = self.logisticsDestinations();

    if (self.logisticsDestinationsFilter().length > 0) {
        return ko.utils.arrayFilter(self.logisticsDestinations(),
            item => (item.name.peek()
                .toLocaleUpperCase()
                .indexOf(self.logisticsDestinationsFilter.peek().toLocaleUpperCase()) >=
                0));
    }

    if (!self.showNotAddressable.peek()) {
        result = ko.utils.arrayFilter(result, item => (item.isAddressable.peek()));
    }

    return result;
}).extend({ paging: '10', rateLimit: 500 });

现在当我填写logisticsDestinationsFilter中的文字时,我的filteredlogisticsDestinations会被计算出来。但是当我检查showNotAddressable时,它不会被计算出来。

我可以通过首先在计算中调用self.showNotAddressable();来实现此功能。但这似乎不是一种好的工作方式,为什么它适用于过滤器而不是Addressable?

任何想法,建议?

谢谢! 托马斯

1 个答案:

答案 0 :(得分:3)

你使用“偷看”:

self.showNotAddressable.peek()

这意味着“只需获取当前值,不要改变”。

这可以防止“subscrilogisticsDestinations”通过订阅“showNotAddressable”observable的更改来计算。

更新1

要启用订阅,您只需编写:

self.showNotAddressable()