2014-01-16 45 views
0

我目前正在使用Durandal框架構建一個簡單的網站(我的第一個Durandal),並對如何添加簡單的JavaScript功能提出了一個問題。我想在DOM加載後調用函數,但不知道如何將它附加到當前視圖模型。我遇到的問題是函數在DOM加載之前被調用並且div ID尚未創建,在本例中爲「sb-search」。如何向Durandal添加自定義JavaScript功能

然後我嘗試添加該功能視圖模型:

define(["plugins/router"], function (router) { 

var vm = { 
     viewAttached: viewAttached 
    }; 

    return { 
     router: router 
    }; 

    function attached() { 
     new UISearch(document.getElementById('sb-search')); 
    } 

    return vm; 

}); 

,但無濟於事。

任何幫助將不勝感激。即使是關於如何「document.write('Hello World')」的簡單教程也會有所幫助。謝謝!

+1

您的功能和您使用的對象顯示它不匹配。 –

+0

是的,編輯{viewAttached:viewAttached}到{viewAttached:attached} –

+0

@JamieHammond儘管他非常可能意味着定義Durandal'attach'處理程序,所以@Craiger使'vm = {attached:attached}' 。 – tne

回答

1

這不是嚴格相關的,但我想添加一些內容到評論中說的內容:您很可能不應掃描attached處理程序中的全局文檔。當它被調用時,組合的視圖可能不會自然而然地被組合/附着,並且總的來說,不對全局狀態做出假設是個好主意。此外,您可以通過不掃描整個DOM來獲得性能。

致電attached時,Durandal passes the root DOM element of the view bound to the view model as the first argument to the function。用它來限制搜索。如果它處於子/組合視圖中,請在完成所有構圖(事件「冒泡」)後調用compositionComplete處理函數。如果它在父視圖中,則使用傳遞給這些函數的第二個參數。如果它真的聽起來太複雜了,那麼考慮一下你的設計可能是本身就有缺陷,尋找MVVM指導。

出於完整性:

的評論提到,

  • 您必須導出正確的函數,
  • 如果你真的打算定義attached處理程序通過調用(attached = viewAttached!) Durandal,知道viewAttached已棄用attached
  • 而且我還想補充說,在返回vm(肯定的視圖模型)之前,您返回一個包含router屬性的匿名對象,雖然這可能是您做過的一些測試的遺留物,並且在此處複製粘貼錯誤。
相關問題