3

更新:我们已经找到了一个看起来非常优雅的解决方案。我在底部添加了所有相关代码。

我们正在评估 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/genderEmblem.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当数据从我们设置isLoadedtrue控制器上的服务器加载时。此外,在路由器中,当浏览离开页面时,我们使用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
4

1 回答 1

0

不确定在提出问题时这是否可用,但您可以定义一个 id 为的模板,loadingEmber.js 将在您可以使用模型中的数据之前显示它

http://emberjs.com/guides/routing/loading-and-error-substates/

于 2014-04-25T14:23:09.647 回答