为什么在模型更新时重新初始化Controller?

时间:2014-01-29 11:10:05

标签: ember.js coffeescript ember-data

以下是我的问题的小玩具版本。

所以我有一个控制器(coffeescript):

Test.PriceController = Em.ObjectController.extend
    init: ->
        this._super();
        console.log 'initialized'

一个模特:

Test.Price = DS.Model.extend
    cost:        DS.attr 'string'

价格模型每5秒从数据源更新一次。每次模型更新时,都会触发控制器初始化中的console.log。似乎无法在ember文档中看到这是否是正确的行为。事实上,我想向控制器添加一个存储最后“cost”值的属性,但是假设对象不断重新初始化,那么当模型更新时,这将被擦除。此外,如果这是正确的行为,可以理解任何替代方法。

总结一下:为什么控制器的行为如此,如果是设计的,那么存储“最后成本”变量的正确方法是什么,如上所述?

1 个答案:

答案 0 :(得分:1)

由于您为每个价格使用itemController,因此您发现的重新初始化确实是设计的。由于价格对象被替换而不是刚刚更新的属性,{{each}}助手创建的虚拟控制器别无选择,只能创建项目控制器的新实例来包装每个对象。 请参阅显示此行为的数组控制器源的这一部分:

https://github.com/emberjs/ember.js/blob/v1.5.0/packages/ember-runtime/lib/controllers/array_controller.js#L219

附加到路径的ObjectController不会发生这种情况的原因是非物品控制器在应用程序的整个生命周期中都是长寿命的单例。

至于如何解决这个问题,我建议您在PricesController(您的ArrayController)中保留较长时间的状态,并让项目控制器使用needs引用该状态API。知道项目控制器是完整的控制器并且如果需要可以访问其他控制器是很有用的。看看这个例子:

http://emberjs.jsbin.com/mivoh/2/edit?html,js,output