2012-10-22 52 views
0

我是BackboneJS的新手,我正在研究一個在其中一個視圖中放映幻燈片的小應用程序。我不確定在視圖中放置啓動幻燈片的代碼的位置。在哪裏以及如何在BackboneJS應用程序中實現SlidesJS?

我使用SlidesJS,我想知道在哪裏拋出此代碼:如果我把它只是內jQuery的準備處理程序(該BackboneJS應用程序之外)

$("#slides").slides(); 

,它得到幻燈片放映只會進行一次,並且由於視圖被重新渲染,它自然不會繼續工作。

無論出於何種原因,我還沒有得到它的工作(我想知道,如果它是一個好主意),如果我把代碼視圖的渲染功能中的任一:

render: function() { 
    this.$el.html(this.template()); 
    this.$("#slides").slides(); 
    return this; 
} 

在哪裏是在BackboneJS中實現像它一樣的SlidesJS或jQuery工具的最佳場所嗎?

謝謝!

+1

在你的視圖的'el'裏面是'#幻燈片嗎? SlidesJS是否需要##幻燈片才能在DOM(用於說大小和位置信息)之前運行?你可以通過setTimeout(function(){$('#slides')。slides()},0)'來檢查後者。 –

+0

我認爲這就對了。 'el'元素不在DOM中,它看起來確實需要。 setTimeout技巧奏效。那麼,我該如何實現這個功能,以便在'el'處於DOM之後調用slides()方法(不需要超時運行)? – SCCOTTT

回答

1

看起來像SlidesJS需要一切呈現和在DOM之前,它可以做它的事情,這可能是因爲它需要大小和位置信息排列幻燈片;我有類似的問題與谷歌地圖和解決方案是視圖的el已經被添加到DOM後推遲綁定到

var $slides = this.$(...); 
setTimeout(function() { 
    $slides.slides() 
}, 0); 

,然後主叫方會:

$something.append(v.render().el); 

在零超時時使用setTimeout是在瀏覽器控制並更新DOM之後運行某些內容的一種技巧。你也可以使用_.defer

_(function() { $slides.slides() }).defer(); 

但這是調用setTimeout的只是一種奇特的方式。

這種方法的缺點是,你假設調用者會調用你的視圖的render,然後立即將你的el添加到DOM。但這並不是什麼壞處,x.append(v.render().el)是標準的Backbone使用。

這種事情有點kludgey,但它是非常安全的,有時你必須克服你的方式解決問題。

+0

謝謝!在這種情況下,我將'slide()'代碼移動到一個方法中,該方法在視圖添加到DOM後從路由器調用,並且我們正在運行。我也會記住這個解決方案,不過,我相信這會再次出現。 – SCCOTTT

相關問題