2012-05-24 78 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