如何在嵌套绑定中获取父模板绑定值?

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

不向&lt;ul&gt; 添加一些像.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,而是传递itemsitemType,所以其中一个孩子$parent.itemType 将包含“foo”。

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

【讨论】:

谢谢。我会选择选项#2,这正是我所需要的。 (现在没有值可以传递给myBinding,有没有约定可以改用什么?=data-bind"myBinding: true"?) 您可以将true'' 传递给它。没有真正的约定。否则,您可以卸下绑定并将其连接到外面。如果你想让你的绑定更通用,那么你可以将listItemClickHandler 传递给它来决定要连接什么。 我可以截取template绑定的init函数并完全摆脱我的自定义绑定吗?

以上是关于如何在嵌套绑定中获取父模板绑定值?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Angular 中绑定多个插值模板?

在使用数据绑定时如何设置嵌套的回收器视图适配器?

绑定视图 - 如何从子列表中获取父属性的详细信息

如何格式化嵌套的多值绑定?

如何将数据绑定到 Angular 2 中的多个嵌套组件?

ItemsPanelTemplate 中的模板绑定