2013-03-09 41 views
13

我只想了解Backbone.Marionette關於UI元素的觀點背後的決定。 當現有的DOM元素上實例化Marionette.View,像這樣:Marionette中UI元素的可用性。查看

view = new Marionette.ItemView({ 
    el: "#element", 
    ui : { 
     whatever : "#whatever" 
    } 
}); 

我能夠訪問view.$el,裏面view.initialize jQuery選擇,到目前爲止,一切順利。 但是,當我嘗試訪問view.ui.whatever時,我只能訪問選擇器,即字符串「#whatever」而不是實際的$("#whatever") jquery選擇器。

原因是因爲Marionette.View.bindUIElements()只在render而不是在initialize之前被調用。

我想知道你是否認爲這種行爲是邏輯的,爲什麼?

我只問在視圖附加到現有的el的情況下,如果視圖是用模板創建的,我確實明白爲什麼綁定在render()

+0

這是一個附註 - 如果您單擊返回按鈕返回頁面,您也會遇到這種情況。在使用ui元素之前調用'this.bindUIElements()'解決了這個問題 – Phil 2015-02-18 01:01:35

回答

25

將視圖附加到現有元素是例外情況。正常的視圖生命週期涉及調用render,並且沒有這樣做,UI元素將不會綁定到任何內容。

當您需要將視圖附加到現有元素時,只需在initialize方法中調用this.bindUIElements()即可。

+0

這就是我正在做的,我只是想知道爲什麼在附加到現有元素的情況下它沒有默認完成。我沒有意識到它被認爲是Marionette哲學中的一個特例。感謝您的回答。 – alistril 2013-03-10 13:07:47

+0

潛水深入,有沒有一種方法使用'Marionette.ItemView'並將它傳遞給預先存在的DOM的'el'?看起來你總是必須自己渲染「el」。 – 2013-09-23 11:56:53

+0

在初始化時調用this.bindUIElements()似乎在使用帶有@ ui.something的'triggers'時會破壞jquery,因爲在調用delegateEvents時,this.ui中的元素不再是字符串,從而打破了jquery selectos。有一個更好的方法嗎?目前我在構建視圖後調用bindUIElements,但它不覺得正確 – Asgaroth 2014-05-08 17:16:15

1

當我使用Marionette時,我將需要訪問ui元素的代碼放入onShow方法中。這個事件在dom準備就緒並且元素準備好被操縱之後被觸發。在這個方法裏面,你的ui.wow現在將指向一個元素而不是一個字符串。

+0

是的,但onShow意味着我有一個渲染,這反過來意味着我有一個模板。在我的情況下,我沒有這樣的表現永遠不會被解僱,對吧? – alistril 2013-03-11 13:47:29

+0

我能夠在沒有模板的情況下使ItemView工作,但onShow中的UI內容未加載。所以我想這樣做並不是一個好方法。我的另一個建議是使用view。$ el.find(「#whatever」)。這應該讓你訪問沒有模板或做渲染的元素。 – Kalpers 2013-03-14 17:52:52