2013-05-07 70 views
3

UPDATE:我們找到了一個解決方案,看起來很漂亮。我在底部添加了所有相關的代碼。Ember.js和Highcharts:只有在加載緩慢加載的模型數據後才能渲染圖形?

我們正在評估Ember.js,以便即將對我們的主要產品 - 分析儀表板進行重大改寫。我們的產品的重點是使龐大的數據集可管理,我們通過使用圖形來實現這一點。所以,我目前正在使用帶有Ember.js的Highcharts進行測試。

我的問題是:處理緩慢加載服務器端數據的最佳方式是什麼?

即:凡在下面的代碼,我應該做出改變,以確保該Highcharts圖被後僅呈現JSON數據,它渲染了從服務器返回?

目前,我有以下航線恩貝爾:

App.Router.map -> 
    @resource 'panel', -> 
    @route 'gender' 

App.Router.reopen 
    location: 'history' 
    rootUrl: '/' 

在這種情況下,面板/性別路線應顯示在網頁的Highcharts圖表,展示了研究小組的分佈。

PanelRoute

App.PanelRoute = Ember.Route.extend 
    model: -> 
    App.PanelMetric.find() 

App.PanelMetric模型:(我不是在這裏使用灰燼的數據,因爲我的JSON結構不與Ember數據的約定標準)

App.PanelMetric = Ember.Object.extend() 

App.PanelMetric.reopenClass 
    find: -> 
    $.getJSON('/panel_metrics.json?callback=?').then (response) -> 
     App.PanelMetric.create(response) 

PanelGenderController

App.PanelGenderController = Ember.ObjectController.extend 
    needs: 'panel' 

panel/gender te mplate(使用Emblem.js):

App.GraphView id=gender_graph contentBinding=controllers.panel.content 

App.GraphView視圖:

App.GraphView = Ember.View.extend 
    tagName: 'div' 
    classNames: [ 'highcharts' ] 

    didInsertElement: -> 
    App.GraphController.render('gender_graph', @content) 

GraphController具有創建實際Highcharts圖的render方法。


UPDATE:如上所述,我們已經找到了這樣的一個(在我們的眼前)優雅的解決方案。這實際上是相當明顯的:我們只是一個在Handlebars中的if/else語句,根據控制器的isLoaded屬性顯示「Loading ...」消息或實際圖形。

我們最初將isLoading設置爲false。在路由器中,我們使用$.getJson加載數據,當數據從服務器加載時,我們在控制器上將isLoaded設置爲true。此外,在路由器中,當從頁面瀏覽時,我們使用deactivate回調將isLoaded設置爲false

PanelGenderController更新:

App.PanelGenderController = Ember.ObjectController.extend 
    isLoaded: false 

    data: (-> 
    gender = @content.gender 

    # Transform "gender" to something Highcharts understands, return an Array 
).property('content') 

    categories: (-> 
    gender = @content.gender 

    # Transform "gender" to an Array of category names, 
    # used for the x-axis of the graph 
).property('content') 

更新PanelGenderRoute

App.PanelGenderRoute = Ember.Route.extend 
    setupController: (controller) -> 
    $.getJSON('/panel_metrics.json?callback=?').then (response) -> 
     controller.set('content', App.PanelMetric.create(response)) 
     controller.set('isLoaded', true) 

    deactivate: -> 
    @get('controller').set('isLoaded', false) 

更新PanelRoute:現在是空的,使用從灰燼所生成的路線。

更新PanelMetric型號:

​​

更新GraphView觀點:

App.GraphView = Ember.View.extend 
    tagName: 'div' 
    classNames: [ 'highcharts', 'app-graph' ] 

    didInsertElement: -> 
    App.GraphController.render(@elementId, @content, @categories) 

更新panel/gender模板:

if isLoaded 
    App.GraphView id=gender contentBinding=data categoriesBinding=categories 
else 
    App.LoadingGraphView 

回答