Ember.js 初始化后未定义Ember ArrayController内容

Ember.js 初始化后未定义Ember ArrayController内容,ember.js,Ember.js,我有一个ArrayController,如下所示: DashboardController = Ember.ArrayController.extend content: [] xFormatter: (x) -> d3.time.format("%m-%d") x init: -> console.log("dashboardController init") @_super() y = undefined currentD

我有一个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++
DashboardController=Ember.ArrayController.extend
内容:[]
xFormatter:(x)->
d3.time.format(“%m-%d”)x
初始化:->
console.log(“dashboardController初始化”)
@_超级()
y=未定义
currentDate=未定义
i=1
而我不到30岁
当前日期=新日期(“12/”+i+“/2011”)
@content.pushObject
x:当前日期
y:(Math.random()*100)/10
我++
当应用程序初始化时,将创建控制器(如控制台中所示),并在
init
期间将内容推入阵列,但当我尝试从其他位置(例如视图)访问
content
时,未定义
content
。我尝试了
content:null
,然后在
init
的开头执行
@set(“content”,[])
,但得到了相同的结果

Ember指南说,在我路线的
setupController
方法中设置ArrayController的
content
属性,告诉它要表示什么模型,但由于这个“模型”实际上是函数的结果,我不确定该怎么做。我认为,由于为每个创建的实例运行
init
,因此每个实例将获得一个填充的
内容
,而无需使用
setupController


我认为我从中得出的示例使用的是一种不适用于1.0.0-rc1的旧方法。我应该如何重新构造它才能工作呢?

好的,看来关键在于将生成值的代码移动到路由的
模型
钩子,然后使用
设置控制器
钩子设置控制器的
内容。我唯一不喜欢的是,每次转换到路由时都会生成数据(因为每次都会调用
model
setupController
钩子)。我想计算一次并缓存它。我想实现这一点的方法是创建一个对象,该对象第一次创建新数据或返回缓存数据,然后在
模型
钩子中调用该对象。

好的,所以看起来技巧是将生成值的代码移动到路由的
模型
钩子中,然后使用
setupController
钩子设置控制器的
内容。我唯一不喜欢的是,每次转换到路由时都会生成数据(因为每次都会调用
model
setupController
钩子)。我想计算一次并缓存它。我认为这样做的方法是创建一个对象,该对象第一次创建新数据或返回缓存数据,然后在
模型
钩子中调用该对象。

一个简单的修复方法(从EmberJS 1.0.0rc-3开始)是在已存在的情况下,在到控制器内容的路由中定义模型。像这样(请原谅咖啡剧本):

不过,master中有一个更改,它阻止了此操作,所以您可能需要这样做

App.MyRoute = Em.Route.extend
  model: ->
    controller = @controllerFor('my')
    controller.get('content') || App.My.find(query)
一个简单的修复(从EmberJS 1.0.0rc-3开始)是在已经存在的情况下,在控制器内容的路由中定义模型。像这样(请原谅咖啡剧本):

不过,master中有一个更改,它阻止了此操作,所以您可能需要这样做

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

您的init代码很可能按预期工作,但ember框架可能会覆盖控制器的内容。你会拉小提琴吗?我认为使用setupController钩子执行此逻辑将非常简单。您的init代码可能会如您所期望的那样工作,但ember框架可能会覆盖控制器的内容。你会拉小提琴吗?我认为使用setupController钩子来执行这个逻辑会很容易。模型钩子只是在通过URL输入路由时被调用的。之后,您应该使用Transitiono,它不需要每次都“生成数据”。当通过URL输入路由时,只需调用模型挂钩。之后你应该使用Transition,它不需要每次都“生成数据”。@RamiroJrFranco作为一个不知道约定的余烬新手,咖啡脚本有点模糊了这个答案…@RamiroJrFranco作为一个还不知道约定的余烬新手,咖啡剧本有点模糊了这个答案。。。