在一个带有生成器的函数中,可能是普通的JS数组或ko.observableArray
,如何以最小的开销使用observableArray
?
这是代码目前的样子:
function (itemGenerator) { // returns observableArray or JS array
var allItems = ko.observable();
// triggered after user interaction
var itemsFromGenerator = itemGenerator();
if (ko.isObservable(itemsFromGenerator)) {
allItems(itemsFromGenerator());
itemsFromGenerator.subscribe(newValue => {
allItems(newValue)
});
} else {
allItems(children);
}
}
如果allItems
是observableArray
,是否可以用itemsFromGenerator
替换observableArray
?因此,我不必订阅进一步的更改"手动"并且必须复制周围的数据。
(这在TreeView实现中使用,我只想在展开节点时生成items数组。)
答案 0 :(得分:1)
只有allItems
包含可观察数组,然后你有外部observable来跟踪替换可观察数组的时间。不需要订阅。
function (itemGenerator) { // returns observableArray or JS array
var allItems = ko.observable();
// triggered after user interaction
var itemsFromGenerator = itemGenerator();
if (ko.isObservable(itemsFromGenerator)) {
allItems(itemsFromGenerator);
} else {
allItems(ko.observableArray(itemsFromGenerator));
}
}
此答案基于您提供的信息。我仍然不知道为什么你需要保持对itemsFromGenerator
的引用,除非它在某种程度上在这个函数之外独立引用。我也不知道实际调用// triggered after user interaction
下的代码的时间。最后,我不知道阵列中这些项目的使用位置和方式。
答案 1 :(得分:1)
如果我做得对,你可以使用ko.utils.unwrapObservable()
(见好explanation):
如果您不知道自己是否获得了可观察量,则应使用ko.utils.unwrapObservable。
代码应该是这样的:
function ViewModel(itemGenerator) {
var self = this;
this.itemsFromGenerator = ko.observableArray();
this.generate = function() {
self.itemsFromGenerator(ko.utils.unwrapObservable(itemGenerator()));
};
}
generate
是您运行项目生成器的触发器。请参阅demo。在generator
函数中,您可以在普通数组和可观察数组之间切换。