2013-10-27 40 views
0

我有一些子視圖,我在容器視圖的didInsertElement事件中以編程方式推入容器視圖。然後,我們在didInsertElement事件期間對呈現的子視圖DOM元素執行一些jQuery操作。當我刷新頁面時,此設置正常工作。但是,當我通過鏈接轉換到頁面時,子視圖的didInsertElement事件在它們處於「preRender」狀態時以及插入到DOM之前被觸發。當視圖位於「preRender」時觸發emberjs didInsertElement

爲什麼didInsertElement事件會在「preRender」期間觸發?刷新頁面時,什麼會導致子視圖行爲的差異,而不是通過路由器轉換到頁面?

回答

2

我不知道你爲什麼會收到這個問題,但有時使用afterRender隊列解決了這個問題。

App.SomeView = Ember.ContainerView.extend({ 
    didInsertElement: function() { 
    // here your view is in rendered state, but the child views no 
    Ember.run.scheduleOnce('afterRender', this, this._childViewsRendered); 
    }, 
    _childViewsRendered: function() { 
    // here your child views is in the rendered state 
    } 
}); 

當所有的渲染完成後執行的渲染後的隊列,所以probally你的孩子的意見會在inDOM狀態,而不是preRender

我希望它能幫助

+0

這似乎已經解決了它。 'Ember.run.scheduleOnce('afterRender',this,this._childViewsRendered);' –

+0

對不起,我錯過了上下文參數,因爲我沒有測試過這個代碼。現在我更新了答案。感謝您展示它。 –

0

當你刷新的DOM被創建和你的jQuery行動/事件工作正常,當你轉換到differenct頁面,通過URL回來附加到jQuery的事件/行動dom仍然存在,因此它們在渲染之前就會啓動。

的解決方案是使用視圖已從DOM刪除後清理了jQuery相關的東西willDestroyElement:

App.MyAwesomeComponent = Em.Component.extend({ 
    didInsertElement: function(){ 
     this.$().on('click', '.child .elem', function(){ 
     // do stuff with jQuery 
     }); 
}, 
    willDestroyElement: function(){ 
this.$().off('click'); 
} 
}); 

更多關於此,請訪問該tutorial

相關問題