2012-03-01 35 views
7

使用didInsertElement鉤子,我可以做一些需要的jQuery插件初始化。但是,如果屬性發生更改,Ember將重新呈現視圖,但不會再次調用didInsertElement。大概這是因爲該元素已經在DOM上,並且只有某些片段已經改變。是否有一個後視圖更改掛鉤(很像didInsertElement)?

我的問題是,有沒有一種方法,我可以重寫,或者一些其他的方式來訪問什麼被一個Ember.ViewAFTER其實際插入的DOM渲染到DOM?我試過使用afterRender,但沒有奏效。

+0

你試過'willRerender'掛鉤了嗎? – 2012-03-01 10:01:17

+0

willRerender不會爲這個 – 2012-08-22 01:33:02

+0

工作,你可以分解另一個子視圖並強制它進入或離開頁面,他們可以得到它的didInsertElement ... – 2012-08-22 01:34:12

回答

0

對不起一些[...]版主刪除,即使它upvoted我原來的答覆... SHM

原來的答覆: 看看這篇文章耶胡達·卡茨http://yehudakatz.com/2011/06/11/using-sproutcore-2-0-with-jquery-ui/。這是舊的,一些代碼需要修改才能使用Ember的當前api,但這是如何將外部框架和插件與Ember集成的一個很好的例子。

0

我定像這樣同一個問題:

Ember.run.sync(); //force applying bindings 
//run after 100ms your code 
Ember.run.later(function() { 
    //your code 
}, 100); 

編輯:由於這是一個古老的答案,它可能是過時當前EmberJS釋放

+0

你把這段代碼放在哪裏?而這100ms聽起來不像這個應該完成的「正確」方式..我希望emberjs有一個didRerenderElement鉤子。 – 2012-11-21 11:28:40

1

您還可以鉤到childViews數組並觀察其變化。

類似這樣的工程,但我不認爲這是一個很好的表現實踐。

childViewsArrayDidChange: function() { 
    console.log("childViews-Array did change"); 
}.observes('[email protected]') 
+0

在發佈此評論時,不能在Ember CLI中使用。解決方案看起來不錯,只是不起作用。 – 2016-01-08 00:15:33

2

我想出了一個解決這個問題的不尋常的方法。您可以在視圖部分重新呈現時觸發事件的make a handlebars helper。我正在使用Bootstrap和jqPlot,並且需要能夠告訴,例如,當div可用於繪製圖表時。與我的幫手,你可以這樣做:

{{#if dataIsLoaded}} 
    {{trigger didRenderChartDiv}} 
    <div id="chartHost"></div> 
{{/if}} 
1

不知道這個問題是否仍然有效,因爲它已經有一段時間了。但沒有選擇答案。 我遇到了類似的問題,我想根據控制器屬性顯示錶單。一旦顯示錶單,我想運行一些JavaScript來綁定事件處理程序。

但是,由於在觸發didInsertElement時元素未顯示,所以Javascript沒有正確綁定事件處理程序。

我的解決方案如下,

控制器&查看

App.FormController = Ember.Controller.extend({ 

    myViewVisible : false, 

    actions : { 

     toggleForm : function(){ 
      this.toggleProperty('myViewVisible'); 
      console.log(this.get('myViewVisible')); 
     } 

    } 
}); 

App.FormView = Ember.View.extend({ 

    isVisible:function(){ 
     this.rerender(); 
    }.property('controller.myViewVisible'), 

    didInsertElement : function(){ 
     // Do JS stuff 
    } 

}); 

而模板

<script type="text/x-handlebars" data-template-name="form"> 
     <h2>Form</h2> 
     <button {{action 'toggleForm'}}>Toggle form</button> 
     {{#if myViewVisible}} 
     {{partial "tform"}} 
     {{else}} 
     <p>Click button to show form</p> 
     {{/if}} 
    </script> 

視圖綁定的控制器的性能。一旦該屬性發生變化,isVisible函數就會啓動並重新渲染視圖。導致didInsertElement再次觸發並將JS代碼綁定到現在可用的DOM元素。

希望這會有所幫助。