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