我有一个ko.computed()
代理这样的集合的函数:
function ListView(query) {
var self = this;
this.query = query;
this.items = ko.observableArray([]);
ko.computed( function() {
self.items( self.query() == null ? [] : self.query().postings() );
}
// more code
}
不幸的是,这会导致self.items()
变量随着对 posts() 数组中每个对象的每次更改而更改。我宁愿做的是有一个计算值项目直接代表查询的帖子。但如果我这样做:
self.items = ko.computed(function() { return self.query().postings(); });
就 Knockout 而言,该值变为标量,而不是数组。这很重要的原因是,当列表中的某些项目更改状态时,我只想更新显示的那些部分,而不是重新渲染整个列表。这不仅仅是一个性能优化(尽管数百个项目的性能也是一个问题),而且我正在尝试记录当前正在显示的项目以跟踪用户可能看到的内容。
我想从逻辑上讲,我想要这样的东西:
self.items = self.query().postings;
但是如果查询发生变化,这会中断,因为(我认为)依赖项存在于不同的对象上。
有没有一种干净的方法来构建依赖机制并仍然保留集合语义?
编辑:2012 年 5 月 13 日
我尝试实现@MichaelBest 建议的扩展方法,但产生了以下错误:
Uncaught TypeError: Object function dependentObservable() {
if (arguments.length > 0) {
set.apply(dependentObservable, arguments);
} else {
return get();
}
} has no method 'valueWillMutate'
ko.utils.arrayForEach.ko.observableArray.fn.(anonymous function) knockout-2.1.0.debug.js:1087
SubviewModel.self.refresh.self.doSort SummaryViewModel.js:73
ko.ignoreDependencies knockout-deferred-updates.js:172
subFnObj.(anonymous function).newCallback knockout-deferred-updates.js:188
ko.subscribable.fn.notifySubscribers knockout-2.1.0.debug.js:870
ko.utils.arrayForEach knockout-2.1.0.debug.js:85
ko.subscribable.fn.notifySubscribers knockout-2.1.0.debug.js:866
evaluateImmediate knockout-deferred-updates.js:300
evaluatePossiblyAsync knockout-deferred-updates.js:246
ko.subscribable.fn.notifySubscribers knockout-2.1.0.debug.js:870
ko.utils.arrayForEach knockout-2.1.0.debug.js:85
ko.subscribable.fn.notifySubscribers knockout-2.1.0.debug.js:866
ko.observable.observable.valueHasMutated knockout-2.1.0.debug.js:946
observable knockout-2.1.0.debug.js:934
updateViewModel knockout.mapping-latest.debug.js:514
changes knockout.mapping-latest.debug.js:389
visitPropertiesOrArrayEntries knockout.mapping-latest.debug.js:569
updateViewModel knockout.mapping-latest.debug.js:374
ko.mapping.fromJS knockout.mapping-latest.debug.js:91
Topic.load querium.js:1212
...