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

  • .type-foo无需添加一些虚假的CSS 类<ul>(这就是我现在所做的)。
  • 期间不存储"foo"在数组项中myBinding.init()
  • 无需内联事件处理程序以利用闭包变量 ( bindingValue)。
  • 不使用 jQuery 的event.data工具。我可以这样做,但我想从淘汰赛的绑定上下文中检索它,除非那是不可能的。
4

1 回答 1

7

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

另一种选择是确保您itemType$parent数据中可用。您可以通过将数据传递给您的模板来做到这一点,例如:

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

items所以,现在我们不只是传递,而是传递itemsand itemType,因此其中一个孩子$parent.itemType将包含“foo”。

示例:http: //jsfiddle.net/rniemeyer/yeN8P/1/

于 2012-05-25T03:11:21.343 回答