我有一个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的旧方法。我应该如何重组这个呢?
答案 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
。我唯一不喜欢的是每次转换到路由时都会生成数据(因为每次调用model
和setupController
挂钩)。我想计算一次并缓存。我想这样做的方法是创建一个Object,它首次创建新数据或返回缓存数据,然后在model
钩子中调用此Object。