如何在嵌套绑定中获取父模板绑定值?
Posted
技术标签:
【中文标题】如何在嵌套绑定中获取父模板绑定值?【英文标题】:How to obtain parent template binding values in a nested binding? 【发布时间】:2012-05-24 18:02:15 【问题描述】:我有一个这样的淘汰模板:
<script type="text/html" id="list">
<ul data-bind="foreach: items">
<li data-bind="text: name"></li>
</ul>
</script>
我是这样使用的:
<div data-bind="
template: name: 'list', data: itemList,
myBinding: itemType: 'foo'
"></div>
我有一个myBinding
自定义绑定处理程序:
ko.bindingHandlers.myBinding =
init: function(element, valueAccessor)
var bindingValue = valueAccessor();
alert ( bindingValue.itemType ); // alerts "foo"
// now set up a jQuery click handler
$(element).on("click", "li", listItemClickHandler);
;
还有一个事件处理程序:
function listItemClickHandler()
var bindingContext = ko.contextFor(this);
alert( "bindingValue.itemType ???" );
);
有没有办法通过敲除的bindingContext
在点击处理程序中获取自定义绑定中提供的父模板的itemType
?
<ul>
添加一些像.type-foo
这样的虚假CSS 类(这就是我现在所做的)。
在myBinding.init()
期间不将"foo"
存储在数组项中。
没有内联事件处理程序以利用闭包变量 (bindingValue
)。
不使用 jQuery 的event.data
工具。我可以这样做,但我想从淘汰赛的绑定上下文中检索它,除非那是不可能的。
【问题讨论】:
【参考方案1】:绑定上下文作为绑定的第 5 个参数传入。因此,您可以在自定义绑定中增加绑定上下文,例如 context.$itemType = bindingValue.itemType;
。示例:http://jsfiddle.net/rniemeyer/yeN8P/
另一种选择是确保您的itemType
在$parent
数据中可用。您可以通过将数据传递给您的模板来做到这一点,例如:
template: name: 'list', data: items: items, itemType: 'foo'
所以,现在我们不只是传递items
,而是传递items
和itemType
,所以其中一个孩子$parent.itemType
将包含“foo”。
示例:http://jsfiddle.net/rniemeyer/yeN8P/1/
【讨论】:
谢谢。我会选择选项#2,这正是我所需要的。 (现在没有值可以传递给myBinding
,有没有约定可以改用什么?=data-bind"myBinding: true"
?)
您可以将
或true
或''
传递给它。没有真正的约定。否则,您可以卸下绑定并将其连接到外面。如果你想让你的绑定更通用,那么你可以将listItemClickHandler
传递给它来决定要连接什么。
我可以截取template
绑定的init函数并完全摆脱我的自定义绑定吗?以上是关于如何在嵌套绑定中获取父模板绑定值?的主要内容,如果未能解决你的问题,请参考以下文章