4

我们使用的是 Ember 的较新版本之一(路由器 V2),而不是更新的路由器 V2.2 的前沿(上次提交:668783a (2013-01-06 21:10:55 -0800))

在我们的解决方案中,我们有几个视图组件(网格、自动完成、搜索视图等)。其中一些组件访问商店、模型等,因此它们有一个控制器来处理这些工作。这些视图在我们解决方案中的多个模板中使用。

在旧版本(pre2)中,我们使用了这样的视图组件:

App.ConsoleView = Ember.View.extend({
    templateName: 'console',
    searchView: App.SearchView.extend(),
    .....
})

在控制台模板中,我们使用了这样的通用视图

{{view view.searchView controllerBinding='App.searchController'}}

我一直觉得这种方法不是最好的方法,而新版本的 Ember 让我们大吃一惊:)

现在的问题是:“在需要控制器的模板中使用共享视图的推荐方法是什么。”

在较新版本的 Ember 中,模板表达式

{{view view.searchView controllerBinding='App.searchController'}}

不起作用,因为 App.searchController 不再在 App 命名空间中实例化。

我想过一些选择,但真的不喜欢它们。

  1. 我可以通过路由器将控制器连接到“父控制器”,但是我必须在使用共享组件的每条路由中都这样做,这会很多。
  2. 我可以通过一些 hacky 方式获取控制器并通过视图 init 函数中的 init 函数进行设置。

有人对如何做到这一点有任何建议吗?我找不到任何关于此的文档,并且已经用完了 googlejuize。

所有回复将不胜感激!

4

1 回答 1

2

我想我会尝试使用 {{render "search"}},它会查找 searchController,然后实例化一个 SearchView 并连接它们。

否则,我知道目前正在讨论以便能够在视图助手中传递控制器类。但尚未实施。

更新:现在,我可能会使用您提出的第二种解决方案,使用https://github.com/emberjs/ember.js/blob/master/packages/ember-routing/lib/ext/controller.js#L33

App.ParentView = Ember.View.extend({
  searchView = Ember.View.extend({
    init: function(){
      this._super();
      this.set('controller', this.get('parentView.controller').controllerFor('search'))
    }
  })
})

在这里,我假设所有搜索视图都将共享同一个控制器(及其底层应用程序状态)。

于 2013-01-16T08:53:22.557 回答