淘汰赛自定义绑定处理程序不更新
问题描述:
我在与创建上下文定制的淘汰赛结合处理问题的子元素。示例如下:http://jsfiddle.net/gf3tfarz/14/淘汰赛自定义绑定处理程序不更新
'容器'应用于可观察数组时,它不更新子元素。
<div data-bind="container: { data: selectedCountry().ids }">
<p>Error: <span data-bind="text: $container.data().length"></span></p>
<div data-bind="foreach: $container.data">
<p>Error: <span data-bind="text: $data"></span></p>
</div>
</div>
这是自定义绑定处理程序:
ko.bindingHandlers.container = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
var innerBindingContext = bindingContext.extend({
$container: ko.utils.unwrapObservable(valueAccessor())
});
ko.applyBindingsToDescendants(innerBindingContext, element);
return { controlsDescendantBindings: true };
}
};
我想,使用的示范工作“容器”目前这两个例子中的一种方式。
注意使用“与”它的工作原理。
答
你不应该直接扩展bindingContext,你应该创建一个子绑定上下文。那么它将会如何工作。
ko.bindingHandlers.container = {
init: function(element, valueAccessor, allBindingsAccessor, viewModel, bindingContext) {
// Make a modified binding context, with a extra properties, and apply it to descendant elements
var innerBindingContext = bindingContext.createChildContext(
bindingContext.$rawData,
null, // Optionally, pass a string here as an alias for the data item in descendant contexts
function(context) {
ko.utils.extend(context, {
$container: ko.utils.unwrapObservable(valueAccessor())
});
});
ko.applyBindingsToDescendants(innerBindingContext, element);
return { controlsDescendantBindings: true };
}
};
请参见本页面底部的详细信息... http://knockoutjs.com/documentation/custom-bindings-controlling-descendant-bindings.html
对不起,_what_是错的小提琴?我们在看什么?我们如何知道它不起作用?你知道吗?究竟发生了什么?这似乎对我有用。 – 2014-11-21 19:29:47
“选择”更改后,“错误:”之后的所有文本都不会更新。这是错误。在我看来,它应该像“Ok:”之后的所有文本一样改变,它使用不同的技术。 – 2014-11-22 02:05:06
一个或多或少容易的解决办法是把你的$容器放入一个计算:http://jsfiddle.net/wn5zp9qu/。然而,在这种情况下,你必须写'$容器()'每一个地方,你要使用它:'数据绑定=“的foreach:$容器()数据”' – nemesv 2014-11-22 14:03:44