【发布时间】:2015-07-29 22:44:12
【问题描述】:
我有一个带有元素的地图,该元素显示当前正在加载哪些图层。我在一个可淘汰的可观察数组中保存了一个图层名称列表。加载新图层时,它们会按预期显示。当图层完成加载时,它们会按预期被移除,除了最后一个。即使调试显示它绑定的列表现在是空的,它也不会被删除。
初始化可观察对象:
self.currentlyLoadingLayers = ko.observableArray([]);
何时加载图层:
self.layerLoadingStarted(layerName);
图层加载时触发的事件:
layer.events.register('loadend', layer, function () {
self.layerLoadingFinished(layerName);
});
以及被调用的函数:
self.layerLoadingStarted = function (layerName) {
self.currentlyLoadingLayers.push(layerName);
};
self.layerLoadingFinished = function(layerName) {
for (var i = self.currentlyLoadingLayers().length - 1; i >= 0; i--) {
if (self.currentlyLoadingLayers()[i] === layerName) {
self.currentlyLoadingLayers().splice(i, 1);
}
}
//if (self.currentlyLoadingLayers().length === 0) self.currentlyLoadingLayers([]);
};
如果我取消注释上面函数中的最后一行,那么一切正常。为什么需要这个?不应该自动观察数组现在为空的事实吗?
我的绑定:
<div id="layersLoadingMessage" data-bind="visible: $root.currentlyLoadingLayers() && $root.currentlyLoadingLayers().length">
<div data-bind="foreach: $root.currentlyLoadingLayers">
<div data-bind="text: $data"></div>
</div>
</div>
【问题讨论】:
-
这是因为您正在操纵
observableArray的底层数组,绕过observableArray对象上的淘汰订阅。