2012-10-31 106 views
4

概述定製淘汰賽結合調用默認淘汰賽結合

當創建一個knockout custom binding包含對淘汰賽默認調用綁定時失敗,我的自定義綁定站第一個呼叫後工作。

要查看問題,請在JSFiddle example中更改ddl中的所選項目一次。文本如預期改變。再次改變它,沒有任何反應。失敗。

詳細

延長默認淘汰賽結合「html」我自己的自定義綁定「htmlFade」當我看到一些奇怪的行爲。我正在尋找的行爲與html binding相同,但使用JQuery淡入淡出動畫來淡入DOM元素。

下面的代碼示例。完整的JSFiddle示例可以參見here

的HTML看起來像這樣:

<select data-bind="options: names, value: selectedName"></select> 
<data-bind="htmlFade : selectedName" class="main"></div> 

JSON數據是這樣的:

var viewModel = { 
    names: ko.observableArray(['Bob', 'Jon']), 
    selectedName: ko.observable('Bob') 
}; 

自定義綁定看起來像這樣:

ko.bindingHandlers.htmlFade = { 
    init: function(element, valueAccessor) { 
     ko.bindingHandlers.html.init(); 
     $(element).hide(); 
    }, 
    update: function(element, valueAccessor) { 
     $(element).fadeOut(700, function() { 
      ko.bindingHandlers.html.update(element, valueAccessor);   
      $(element).fadeIn(700); 
     });   
    } 
}; 

我有意延遲到默認的HTML處理程序的行「ko.bindingHandlers.html.update(element,valueAc cessor)「,因爲我的目標是擴展的行爲,而不是重新創建。

問題我在做的是上面的代碼在第一次選擇列表被更改時工作。之後它失敗了。

我創建另一個JSFiddle example其中,代替延伸的行爲,我通過添加下列行「http://jsfiddle.net/jamshall/kYwEE/1/」重新創建它代替(從knockout source for the default html binding複製)上面引用html.update調用。這似乎工作正常。

我的問題,那麼,是爲什麼第一個電話後,我的工作自定義綁定站時,我包括爲默認從withing它綁定一個電話?或者,爲了簡單起見,爲什麼JSFiddle1無效,但JSFiddle2有效?

感謝所有幫助

回答

1

你可以把自定義的像一個計算觀察到的結合的update功能(剔除並執行一個元素的綁定使用時計算觀測跟蹤依賴)。所以,在你的自定義綁定中,你並沒有獲取對你綁定的observable的依賴,因爲你的代碼是異步執行的。

在你update,你可能會想要做的事,如:

update: function(element, valueAccessor) { 
    //just grab dependency 
    ko.utils.unwrapObservable(valueAccessor()); 

    $(element).fadeOut(700, function() { 
     ko.bindingHandlers.html.update(element, valueAccessor);   
     $(element).fadeIn(700); 
    });   
} 

所以,我們只訪問觀察到的值搶依賴。 ko.utils.unwrapObservable只是安全地處理檢索價值,無論它是否是不可觀察或可觀察的。

更新的樣本:http://jsfiddle.net/rniemeyer/6UtsP/10/