【问题标题】:Why is Controller reinitialised when model updates?为什么在模型更新时重新初始化控制器?
【发布时间】:2014-02-21 03:36:37
【问题描述】:

下面是我的问题的一个小玩具版本。

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

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

还有一个模型:

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

价格模型每 5 秒从数据源更新一次。每次模型更新时,都会触发控制器init中的console.log。似乎无法在 ember 文档中看到这是否是正确的行为。问题是,我想向存储最后一个“成本”值的控制器添加一个属性,但鉴于对象不断被重新初始化,当模型更新时这将被擦除。此外,如果这是正确的行为,将不胜感激任何替代方法。

总结一下:为什么控制器会这样做,如果是设计使然,那么像我上面概述的那样存储“最后成本”变量的正确方法是什么?

【问题讨论】:

  • 你是如何更新模型的?
  • 我在我的 Adapter 的 find() 中点击了 JSON API,然后在调用 @_super 之前,Serializer 在 extractSingle() 中对 JSON 进行了一些处理。 Ember 负责其余的工作,我不会显式更新模型。
  • 所以你再次调用find 并且模型正在下面更新。集合中的模型和价格控制器是否用作项目控制器?
  • 是的,视图中的输出是{{#each price itemController='price'}}

标签: ember.js coffeescript ember-data


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-24
    • 1970-01-01
    • 2020-08-31
    • 2022-11-13
    • 2015-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多