【发布时间】:2018-03-05 22:27:48
【问题描述】:
我有嵌套的自定义敲除绑定。
顶级绑定扩展绑定上下文并添加到它。
子绑定必须是子绑定,因为它使用添加到绑定上下文的数据。
伪代码-
ko.bindingHandlers.map = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
let map = new map({element: element});
let innerBindingContext = bindingContext.extend({"map": map});
ko.applyBindingsToDescendants(innerBindingContext, element);
// tell KO *not* to bind the descendants itself, otherwise they will be bound twice
return { controlsDescendantBindings: true };
}
};
ko.bindingHandlers.overlay = {
init: function(element, valueAccessor, allBindings, viewModel, bindingContext) {
let map = bindingContext.map;
let overlay = new overlay({element: element});
map.addOverlay(overlay);
// have tried 1. code below,
// 2. createChildContext,
// 3. not returning anything,
// 4. ko.cleanNode(element); prior to binding,
// all with the same error
let innerBindingContext = bindingContext.extend({});
ko.applyBindingsToDescendants(innerBindingContext, element);
return { controlsDescendantBindings: true };
}
};
var vm = {
someVariable: ko.observable("test");
}
ko.applyBindings(vm);
HTML -
<div data-bind="map:{}">
<div data-bind="overlay:{}">
<span data-bind="text:someVariable"></span>
</div>
</div>
无论我做什么,我都会收到错误 -
“您不能对同一个元素多次应用绑定。”
绑定实际上是在使用 javascript 库。该库将 childbinding dom 元素移动到 HTML 中的其他位置。我认为这就是问题所在。
为什么我会因为 dom 元素被移动而收到这个错误,我该如何解决这个问题?
【问题讨论】:
-
尝试将
ko.cleanNode(element);添加到地图绑定处理程序的最顶部。这可能会从绑定层次结构中删除整个块。 -
@JasonSpake - 我认为这解决了它。它只需要在第三方对象实例化之前添加,必须在元素在 dom 中移动时添加。谢谢!我不明白的是,为什么如果我返回 {controlsdescendantbindings: true} 它会尝试重新绑定。如果您创建答案,我会将其标记为答案
-
我认为后代绑定命令适用于任何子节点,但顶级元素本身已被主 ko.applyBindings 调用标记为绑定。明天当我在一台真正的计算机上时,我会尝试添加一个更好的答案。
标签: knockout.js