2012-05-24 81 views
3

我有一个淘汰赛的模板是这样的:如何获取嵌套绑定中的父模板绑定值?

<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 ???"); 
}); 

有没有办法让父模板的itemType,如自定义绑定提供,单击处理程序虽然淘汰赛的bindingContext

  • 没有加入一些虚假的CSS类像.type-foo<ul>(这就是我现在做的)。
  • myBinding.init()期间没有在数组项目中存储"foo"
  • 没有对事件处理程序进行内联以利用闭包变量(bindingValue)。
  • 不使用jQuery的event.data工具。我可以做到这一点,但我想从淘汰赛的结合上下文中检索它,除非这是不可能的。

回答

7

绑定上下文作为第5个参数传入绑定。因此,您可以增加您的自定义绑定中的绑定上下文,如context.$itemType = bindingValue.itemType;。此处示例:http://jsfiddle.net/rniemeyer/yeN8P/

另一种选择是确保您的itemType可用于$parent数据。您可以通过将数据传递到您的模板像这样做:

template: {name: 'list', data: { items: items, itemType: 'foo' } }

因此,而不是只是路过items,现在我们通过itemsitemType,所以从孩子$parent.itemType之一将包含“富”。

样品在这里:http://jsfiddle.net/rniemeyer/yeN8P/1/

+0

谢谢。我会选择#2,这正是我需要的。 (现在没有值传递给'myBinding'了,是否有一个约定是什么?'= data-bind“{myBinding:true}”'?) – Tomalak

+0

你可以通过'{}'或'true '或者''''给它。没有真正的约定。否则,您可以删除绑定并将其连接到外部。如果你想让你的绑定更通用,那么你可以将'listItemClickHandler'传递给它来决定连接什么。 –

+0

我是否可以截取'template'绑定的init函数并完全摆脱我的自定义绑定? – Tomalak