我有一个使用 KnockoutJS 的页面,其中有相当多的 observables(这里有大约 35 个相关,总共大约 60 个)。我使用了 KO 映射插件,但我不知道这是否与我的问题有关。
大多数(不是全部)可观察对象都绑定到输入字段。
用户可以将当前输入集保存到命名集,或从先前保存的集重新加载。有 UI 指示当前输入集是来自已保存的集,还是已编辑(未保存)的输入。
为了在编辑任何输入时更新“保存/加载输入”UI(我不在乎哪一个),我订阅了所有相关的“输入”观察值。
这是我的奇怪问题:当订阅的 observables 的数量大约为 25 或更高时,我从调用的深处收到了对回调函数的虚假ko.applyBindings(...)
调用。
- 当它发生时,只有一个虚假回调
- 被报告的输入通常是我订阅的最后一个。
- 如果我删除了足够多的订阅,以至于我订阅了大约 25 个或更少,虚假回调就会消失。
- 如果我通过了该限制并继续添加订阅,则调用会在我不断添加到列表中时重新出现在不同的字段中。
- 如果我订阅所有输入,那么回调声称是一个
__ko_mapping__
荒谬的回调。
我必须假设我没有正确绑定到订阅,或者 KO 或 KO 映射插件中存在一些错误,导致订阅列表混乱。到目前为止,我无法跟踪问题。
订阅代码大致如下:
// markSavedInputsDirty(name) defined elsewhere
function registerCallbacks() {
var data = viewModel.inputs;
var member;
for(member in data) {
if (data.hasOwnProperty(member) && ko.isObservable(data[member])) {
if(member /* ... not certain observables which I need to ignore */ ) {
data[member].subscribe(function() {return markSavedInputsDirty(member)}, data[member]);
}
}
}
}
(注意:上面的代码跟踪调用了哪个成员,但仅作为调试帮助。当我们最初看到问题出现时,代码过去只是对所有可观察对象使用相同的回调函数(没有柯里化))
有没有人见过这样的事情?