2012-05-13 183 views
0

當我試圖對onRender方法(或回調中的item:rendered回調)中的某些HTML元素採取行動時,它會失敗。onRender中的元素不起作用

例子:

 
Bars.EditGallery = Backbone.Marionette.ItemView.extend 
    template: 'bars/edit_gallery' 
    className: 'edit-gallery' 

    onRender: -> 
    # If I just write @$('select').chosen(), it doesn't work 
    # despite the jQuery object contains what I expect. 
    # To get it working, I have to write: 
    callback = -> @$('select').chosen() 
    setTimeout(callback, 0) 

這是與其他人的行爲一樣,就像給焦點領域。
你如何處理?與setTimeout作品的伎倆,但它不是很優雅。

回答

1

我見過這種情況發生時,用於渲染的模板異步加載。我認爲我的拉取請求已在最近的發佈中解決了這個問題。你用什麼版本的Marionette?

但它看起來像你使用JST,反正,所以不應該是問題。您的設置中是否有其他任何內容導致渲染異步發生?

雖然這似乎很可能會出現一些異步問題。由於使用setTimeout解決了這個問題,這讓我認爲在調用onRender方法之前渲染沒有完成。

此外 - 它可能很難說,如果jQuery選擇器實際上是返回你想要的對象,馬上。如果您使用console.log來檢查選擇器,則可能會給出錯誤結果。 console.log本身就是異步的(在大多數瀏覽器中,反正......不確定全部),這意味着記錄項目的請求會在事件循環結束時排隊。在日誌記錄發生時,DOM元素可能是可用的。

FWIW:我經常使用onRender這個確切的目的,我從來不必使用setTimeout來使它工作。所以我的假設是有趣的與渲染過程,與異步的東西有關。

+0

我注意到,當我使用$(selector)而不是這個時,問題不會發生$(selector)。 –