初始化后,Ember ArrayController内容未定义

时间:2013-03-03 20:59:09

标签: ember.js

我有一个ArrayController,如下所示:

DashboardController = Ember.ArrayController.extend
  content: []

  xFormatter: (x) ->
    d3.time.format("%m-%d") x

  init: ->
    console.log("dashboardController init")
    @_super()

    y = undefined
    currentDate = undefined
    i = 1

    while i < 30
      currentDate = new Date("12/" + i + "/2011")
      @content.pushObject
        x: currentDate
        y: (Math.random() * 100) / 10

      i++

当应用程序初始化时,创建控制器(如控制台中所示),并在init期间将内容推送到数组中,但当我尝试从其他地方访问时,content未定义(例如一个观点)。我尝试content: null,然后在@set("content", [])的开头做init,但结果相同。

Ember指南说我在路由的content方法中设置一个ArrayController的setupController属性来告诉它代表什么模型,但由于这个“模型”实际上是一个函数的结果,我我不知道该怎么做。我认为,因为init是为每个创建的实例运行的,所以每个实例都会得到一个填充的content而不使用setupController

我认为我从中提取的示例是使用不适合1.0.0-rc1的旧方法。我应该如何重组这个呢?

2 个答案:

答案 0 :(得分:1)

一个简单的修复(从EmberJS 1.0.0rc-3开始)是在控制器内容已存在的情况下定义路径中的模型。像所以(原谅咖啡脚本):

App.MyRoute = Em.Route.extend
  model: ->
    @get('controller.content') || App.My.find(query)

虽然主人有变化,但这会阻止它工作,所以你可能需要做

App.MyRoute = Em.Route.extend
  model: ->
    controller = @controllerFor('my')
    controller.get('content') || App.My.find(query)

答案 1 :(得分:0)

好的,似乎诀窍是将生成值的代码移动到路由的model挂钩,然后使用setupController挂钩设置控制器的content 。我唯一不喜欢的是每次转换到路由时都会生成数据(因为每次调用modelsetupController挂钩)。我想计算一次并缓存。我想这样做的方法是创建一个Object,它首次创建新数据或返回缓存数据,然后在model钩子中调用此Object。