【问题标题】:Ember multiple instance of controllersEmber 多个控制器实例
【发布时间】:2012-10-22 15:52:07
【问题描述】:

我使用 Ember 已经有一段时间了,但有时仍然在努力寻找最佳实践。所以关于控制器和视图的 Ember 方法之一是

Ember 设计者的观点是,路由器强制执行的是,对于给定的 BaseName(例如“Application”、“CustomerEntry”、“My Items”)应该有一个 BaseNameView 和一个 BaseNameController。 -- Ember guide

问题是,如果我想要一个页面上同一视图的多个实例,该怎么办。由于控制器是在应用程序启动期间创建的,因此它们是应用程序命名空间下的单例,无法保存模型数据的两个实例。

我看到的一个解决方案是手动创建控制器(和模型数据)并将它们传递给视图。但在这种情况下,我希望 Ember 不会为我自动创建控制器。换句话说,为什么 Ember 会在应用程序启动期间将控制器创建为单例。

【问题讨论】:

  • 您确定需要拥有同一个控制器的多个实例吗?听起来您可以将不同的控制器与您需要的不同视图相关联。控制器不保存模型数据的不同实例,它们通常使用绑定将数据代理到视图。我对 Ember 架构的理解是 Views 的想法是严格负责 DOM/CSS 内容和处理用户事件。应用程序逻辑保留在路由器/控制器级别,因此拥有多个不同的控制器可能是有意义的,即使它们代理相同的数据。

标签: model-view-controller ember.js


【解决方案1】:

我认为在很多用例中,View 类型没有对应的 Controller 类型。尤其是当视图类型更像是 UI 小部件而不是成熟的应用程序功能时。许多视图可以共享同一个控制器。看看这个 applicationView 模板:

<h1>Here are two files, compare them</h1>
{{view App.MyFileView contentBinding="leftFileContent"}}
{{view App.MyFileView contentBinding="rightFileContent"}}

这会创建我的视图类的两个实例,并将它们的内容属性绑定到 applicationController 上的两个不同属性。这两个视图的控制器属性都设置为单例 applicationController 实例。

控制器是单例的一个可能原因是它们能够通过App.router.myController 之类的方式在全局命名空间中进行寻址。

【讨论】:

  • 使用controllerBinding属性怎么样?
猜你喜欢
  • 2013-03-20
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多