2013-05-09 35 views
0

時,視圖並不總是附加在Durandal中,我有一個具有函數viewAttached()的ViewModel。在Durandal視圖模型中,當viewAttached()調用

根據the docs這應該在視圖附加到DOM後調用。

在我的功能我在視圖中的元素被附加一個jQuery選擇:打印到控制檯

function viewAttached() { 
    console.log($("#myViewId").length); 
} 

大多數時候,我準確地得到「1」,但也許10%的我得到0的時間。該視圖尚未實際附加到DOM。

有沒有其他人有這個問題?

回答

1

viewAttached獲取生成的DOM子樹作爲參數傳入。

所以,你既可以將代碼更改爲沿線

function viewAttached(view) { 
    console.log($(view).length); 
} 

,如果你想,如果你需要一些具體的工作包與jQuery或

function viewAttached(view) { 
    console.log($(view).find('mySubSelector').length); 
} 

整個視圖子樹元素。

+0

是的,這正是我最終做的。幸運的是,因爲代碼是我自己的,所以還有一些其他的jQuery庫在內部使用'$(...)'做事情,總是假設您的元素將位於主DOM上。它的不一致性真的讓我感到困惑。如果它始終處於關閉狀態或始終關閉DOM,則至少會一致:) – CodingWithSpike 2013-05-09 19:19:31

+0

那麼當您嘗試訪問它時,您的父母是否已經在DOM中?根據文件:「這允許控制器或演示者可以直接訪問dom子樹,在它被注入到其父項之後的某個時間點綁定到該dom子樹。」 – RainerAtSpirit 2013-05-09 19:31:17

0

有幾件事情需要注意:

  1. viewAttached當前模塊的視圖後大火被連接到它的直接父,這不一定是當它被附加到DOM。在某些情況下,這是一個明顯的限制。對於Durandal 2.0,我們添加了一個名爲documentAttached的附加回調函數,當所有東西都附加到頁面的dom時,它會觸發。

  2. viewAttached傳遞當前模塊的視圖。您應該使用它爲您編寫的任何jQuery代碼提供上下文。