Ember.js 初始化后未定义Ember ArrayController内容
我有一个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
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作为一个还不知道约定的余烬新手,咖啡剧本有点模糊了这个答案。。。