下面是我的问题的一个小玩具版本。
所以我有一个控制器(咖啡):
Test.PriceController = Em.ObjectController.extend
init: ->
this._super();
console.log 'initialized'
和一个模型:
Test.Price = DS.Model.extend
cost: DS.attr 'string'
价格模型每5秒钟从数据源更新一次。每次模型更新时,控制器初始化中的console.log都会被触发。在ember文档中似乎看不到这是否是正确的行为。事实是,我想为存储最后一个“成本”值的控制器添加一个属性,但是鉴于该对象一直在重新初始化,因此在模型更新时将清除该属性。同样,如果这是正确的行为,则将意识到任何其他替代方法。
总结一下:控制器为什么要这样工作?如果是设计使然,那么存储“最后一次成本”变量的正确方法是什么,就像我上面概述的那样?
由于您使用itemController
每个价格的,因此您发现的重新初始化确实是设计使然。由于要替换价格对象而不是更新其属性,因此{{each}}
助手创建的虚拟控制器别无选择,只能创建新的项目控制器实例来包装每个对象。请参阅显示以下行为的阵列控制器源代码的这一部分:
ObjectController
附加到路由不会发生这种情况的原因是,非项目控制器在应用程序的整个生命周期中都是长期存在的单例。
至于如何解决此问题,我建议在PricesController
(您的ArrayController
)中保留更长寿命的状态,并简单地让项目控制器使用needs
API引用该状态。知道项目控制器是成熟的控制器,并在需要时可以访问其他控制器,这很有用。在此处查看此示例:
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句