更新:我们已经找到了一个看起来非常优雅的解决方案。我在底部添加了所有相关代码。
我们正在评估 Ember.js,以便我们即将对我们的主要产品(分析仪表板)进行重大改写。我们产品的重点是使庞大的数据集易于管理,我们实现这一目标的一种方法是使用图表。所以,我目前正在使用带有 Ember.js 的 Highcharts 进行测试。
我的问题是:处理用作图表源的加载缓慢的服务器端数据的最佳方法是什么?
那就是:我应该在下面的代码中的哪个位置进行更改,以确保 Highcharts 图表仅在它呈现的 JSON 数据从服务器返回后才被呈现?
目前,我在 Ember 中有以下路线:
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
模型:(我在这里没有使用 Ember Data,因为我的 JSON 结构不符合 Ember Data 的约定)
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
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
一种render
方法可以创建实际的 Highcharts 图。
更新:如上所述,我们已经找到了一个(在我们眼中)优雅的解决方案。这实际上相当明显:我们只是在 Handlebars 中使用 if/else 语句,根据isLoaded
控制器的属性,显示“正在加载...”消息或实际图形。
我们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
:现在是空的,使用从 Ember 生成的路由。
更新PanelMetric
型号:
App.PanelMetric = Ember.Object.extend()
更新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