2013-02-28 152 views
2

是否有可以觀察到的事件,類似於正在渲染視圖/模板時與數據加載相關的ember-data事件,如isLoaded/isUpdating?觀察渲染事件

我有一個進入列表的1000個元素的列表,它需要相當一段時間才能渲染(整個其他問題的主題)。我想向用戶展示渲染工作正在完成的一些跡象。

在微觀層面上還有一些事件,例如:http://emberjs.com/api/classes/Ember.View.html#event_willClearRender。我很想知道是否有任何渲染正在執行的事件。

+0

只是要清楚,我已經表現出了類似的加載微調當數據從適配器加載。 – 2013-02-28 02:19:53

回答

8

Ember.Instrumentation提供了一種通用的方法來測試代碼,並且方便,默認情況下,Ember會在渲染東西時發出檢測事件。

Ember.subscribeEmber.subscribe用於爲前後設置偵聽程序 - 事件的命名空間爲句點,因此訂閱「渲染」將使您全部呈現工具調用,默認情況下它類似於「render.boundHandlebars」,「render .metamorph「,」render.view「...

這裏有一個小函數可以幫助您開始......您可以將其粘貼到控制檯中並單擊您的應用程序以查看它(或者如果您想查看從開始的所有渲染將其粘貼到代碼中的某處,以便在ember之後但在應用程序之前加載它)。

如果沒有事件傳遞給beginInstrumentation它會默認爲render ...

beginInstrumentation = function(eventName) { 
    var styles; 
    if (eventName == null) { 
    eventName = "render"; 
    } 

    styles = { 
    "render.render.metamorph": "color: #a47701;", 
    "render.render.boundHandlebars": "color: #0f51fe;", 
    "render.view": "color: #37be02;" 
    }; 

    Ember.subscribe(eventName, { 
    before: function(name, ts, payload) { 
     console.group(name); 
     return ts; 
    }, 
    after: function(name, ts, payload, b_ts) { 
     var elapsed, style; 
     style = styles[name] || ""; 
     elapsed = (ts - b_ts).toFixed(4); 
     console.log("%c" + payload.object + ": " + elapsed + "ms", style); 
     return console.groupEnd(); 
    } 
    }); 
}; 

beginInstrumentation(); 

繼承人鉻輸出,當我將其粘貼到TodoMVC應用,然後點擊全部/已完成/有源濾波器(應在Firefox/Firebug的工作以及)

enter image description here

+0

這是一個很好的答案,也是一個很棒的示範。謝謝!我想後續的問題是:顯示/隱藏一個「微調」適當使用這種儀器?它不太喜歡它,但我可能是錯的。 – 2013-02-28 16:55:55

+0

雅這是一個很好的問題,考慮到我甚至不能100%確定儀器是包含在Ember的生產構建包(我認爲它是,因爲它是在灰燼中)。我想這歸結於你如何在你的代碼中做事 - 它歸結爲一個具有「加載」屬性的控制器,觀察該屬性以確定加載微調器是否顯示 - 那麼你如何更新那加載屬性?你有選項..重寫View.render,如果你需要..基於任何數量的狀態轉換視圖使..重寫renderToBuffer ..儀器... – chrixian 2013-03-01 02:38:56

+0

剛剛發現一個很好的帖子在這個話題上,檢查出來這裏:http://tobyho.com/2013/03/12/perf-testing-ember.js-views/ – 2013-03-25 03:24:55