2013-08-04 71 views
8

喜歡的東西準備好文件,但所有灰燼的觀點呈現執行代碼一次之後所有的意見都在Ember.js完全呈現

後,我現在這樣做的權利與ApplicationView didInsertElement,這似乎是工作,所以一個覆蓋遠:

App.ApplicationView = Em.View.extend({ 
    didInsertElement: function() { 
    // Do your magic. 
    } 
}); 

我想知道如果這是灰燼文件以正確的方式做好準備,或者灰燼有這種簡單很平常的事情更原生支持。

回答

5

didInsertElement是正確的地方,但如果你想完全確保您的渲染隊列完全刷新你也可以聽afterRender事件,像這樣:

App.ApplicationView = Ember.View.extend({ 
    didInsertElement: function() { 
    Ember.run.scheduleOnce('afterRender', this, 'processChildElements'); 
    }, 

    processChildElements: function() { 
    // do here what you want with the DOM 
    } 
}); 

希望它能幫助。

+3

其實,ApplicationView似乎不正確的地方,它的工作原理對於第一個要求,但是當你開始渲染之後,其他模板,鉤子不會起火。我在渲染後想要執行代碼的特定視圖上定義了didInsertElement,並且該工作正常,但如果Ember在所有視圖渲染後都有一個通用鉤子,那麼每次轉換都會很好。 – clueless

+0

@clueless,你提到'$(document).ready'是的,'ApplicationView'用於第一個請求,對於你需要做的所有其他視圖,我猜你已經評論過了。據我所知,當渲染所有視圖時沒有內置的鉤子。 – intuitivepixel

+0

@clueless'$(document).ready'沒有等價物,因爲這會導致全局的意大利麪代碼。你應該把你的jQuery邏輯放入視圖中,最適合這個任務。 – mavilein

10

通過重新打開基本View類並將其添加到渲染隊列中,您可以輕鬆地添加「發佈渲染」掛鉤。

下面是一些代碼來告訴你如何:

Ember.View.reopen({ 
    didInsertElement : function() { 
     this._super(); 
     Ember.run.scheduleOnce('afterRender', this, this.didRenderElement); 
    }, 
    didRenderElement : function() { 
     // Override this in your View's 
    } 
}); 
+0

這是朝正確方向邁出的一步。目前我試圖在任何轉換或刷新後在頁面的呈現上運行javascript。我試圖把我的jquery塊放在willTransition,didTransition和應用程序路由中的before和afterModel掛鉤上,但沒有運氣。有任何想法嗎? – genkilabs

0
App.ApplicationView = Ember.View.extend({ 
    afterRender: function() { 
    Ember.run.next(this, function() { 
     // This will run one time, after the full initial render. 
    }); 
    } 
}); 
相關問題