2012-04-25 53 views
24

我有一個knockout綁定處理程序,它使用plupload進行拖放和ajax上傳。敲除綁定處理程序的拆卸函數?

要使用plupload腳本創建plupload而這又是綁定事件監聽器的DOM元素的一個實例。

這工作正常。

不過,我有「文件夾」列表,當我點擊一個文件夾我顯示該文件夾中的文件列表。我通過使用foreach綁定selectedFolder()。文件來重複使用相同的DOM元素。

我的問題是,在我的結合處理我做我的所有東西plupload在初始化函數,因爲我重用的DOM元素,他們得到綁定到這些多個事件處理程序。這會導致拖放事件發送給alla處理程序。這意味着,如果我在渲染的文件列表上放置文件,那麼drop事件也會在所有以前渲染的文件列表上觸發。

我正在尋找的是綁定處理程序中的某種拆卸或清理功能,以便我可以在文件列表變爲無格式時取消註冊所有事件(是一個字嗎?)。

也許我們無法檢測到無約束力?那我將如何處理呢?我不希望有一個全局實例,因爲這會阻止我同時在多個地方使用綁定。

對不起,沒有給你任何代碼。我在我的手機atm。

乾杯!

回答

32

每當KO刪除元素(模板時重新渲染等)可以註冊將要執行的處理程序。它看起來像:

//handle disposal (if KO removes by the template binding) 
    ko.utils.domNodeDisposal.addDisposeCallback(element, function() { 
     $(element).datepicker("destroy"); 
    }); 

所以,在你的「初始化」功能,您將註冊被綁定的元素的處置回調,你必須運行,你會喜歡的任何清理代碼的機會。

+0

這絕對能解決我的問題。可惜它並沒有被稱爲不屈不撓。謝謝RP! – 2012-04-25 22:38:38

+0

如果您正在與其他自己進行DOM操作的庫混合(在單頁應用程序中常見),那麼您可能需要考慮下面的jQuery方法,該方法會觸發任何DOM刪除(而不僅僅是由淘汰賽觸發的)。如果您已經參考了jQuery,這很有用。 – 2013-06-12 16:03:46

3

我相信,如果淘汰賽是一個去除DOM節點(即當它rejigs模板)這裏所提供的解決方案纔有效。我很難在特定條件下觸發它。可能會出現以下情況,無論您的元素如何刪除,您都需要執行回調;無論是使用Knockout還是通過jQuery.html()等(特別是在單個頁面應用程序中)。

我釀製不同的方法添加這樣的鉤與jQuery的一點幫助。使用特殊事件API(詳細描述爲here),您可以添加一個方法,該方法在DOM節點發生特定事件(removed)(在拆解時發生的事情)時執行。

如果您在使用jQuery結合使用淘汰賽,你可以換到淘汰賽結合是這個樣子的:

ko.bindingHandlers.unload = { 
    init: function (element, valueAccessor) { 
     var eventName = 'your_unique_unLoad_event'; // Make sure this name does not collide 
     if (!$.event.special[eventName]) { 
      $.event.special[eventName] = { 
       remove: function (o) { 
        o.data.onUnload() 
       } 
      }; 
     } 
     $(element).on(eventName, { onUnload: valueAccessor()}, $.noop); 
    } 
}; 

然後,您可以使用此任一元素,就像這樣:

<div id="withViewModelMethod" data-bind="unload: aMethodOnMyViewModel" /> 
<div id="withInLineMethod" data-bind="unload: function() { /* ... */ }" /> 

我欠學分SO post

+0

我不知道你是如何得到這個** var eventName ='_unique_unLoadEventName ____ 12345'; **只是試圖理解,因爲我遇到了類似的情況。 – nimgrg 2013-05-23 09:07:15

+0

這只是我從帽子裏拿出來的一根繩子。它可以是任何你想要的,我只是想確保它是唯一的,並且不會與任何其他插件或第三方代碼相沖突,這些插件或第三方代碼將添加他們自己的事件處理程序。在這個例子中它有點誇張.. – 2013-06-12 15:57:47

+0

也許只是將'_unique_unLoadEventName____12345'更改爲'your_unique_unLoad_event' – 2013-07-14 09:17:01