Ember.js 如何将多个实例加载到模板中?

Ember.js 如何将多个实例加载到模板中?,ember.js,Ember.js,我们正试图构建一个门户,在这个门户中,一个布局可以在主布局中以任何顺序拥有任意数量的核心小部件 为了模拟这一点,我们有许多出口: <h1>{{title}}</h1> {{outlet pos1}} {{outlet pos2}} {{outlet pos3}} {{outlet pos4}} {{outlet pos5}} {{outlet pos6}} {{outlet pos7}} {{outlet pos8}} {{outlet pos9}} {{outlet

我们正试图构建一个门户,在这个门户中,一个布局可以在主布局中以任何顺序拥有任意数量的核心小部件

为了模拟这一点,我们有许多出口:

<h1>{{title}}</h1>

{{outlet pos1}}
{{outlet pos2}}
{{outlet pos3}}
{{outlet pos4}}
{{outlet pos5}}
{{outlet pos6}}
{{outlet pos7}}
{{outlet pos8}}
{{outlet pos9}}
{{outlet pos10}}
但是,当有多个上下文时,将使用最终上下文。在这个例子中,我们得到了toDo对象的两个实例,它们都是id为15的

我是否以正确的方式实现了这一点,是否可以通过编程实现,而不是固定的门店布局

谢谢,
Dan

编辑:我的回答基于这样一个假设,即在您的案例中确实需要这个复杂的解决方案。根据您的简单示例,您还可以说,您可以对所有待办事项使用ArrayController。但下面是我对这个复杂问题的答案的尝试:

问题在于以下两行:

router.get('groupController').connectOutlet('pos9','toDo',App.toDo.find(41));
router.get('groupController').connectOutlet('pos3','toDo',App.toDo.find(15));
你在那里基本上做的是:

  • 将名为pos9的插座与名为“todo”的控制器连接。将此控制器的内容设置为Id为41的ToDo
  • 将名为pos3的插座与名为“todo”的控制器连接。将此控制器的内容设置为Id为15的ToDo(以便覆盖同一控制器的内容)
  • 结果是两个插座都连接到同一控制器实例。由于您已经两次设置了这个实例的content属性,所以您可以使用相同的TODO从我的观点来看,核心问题是:默认情况下,EmberJS使用控制器的单个实例。
  • 因此,我的解决方法是为您拥有的每个插座实例化一个新控制器。不幸的是,这也需要修改视图的查找。您可能知道,控制器和视图是按名称匹配的。因此,该算法大致上是伪代码:

  • 创建控制器的新实例,例如:var newController=App.ToDoController.Create()
  • 使用适当的名称将此控制器注入路由器,例如router.set('todoControllerForPos9',newController)
  • 基于此名称,您必须启用Ember以查找匹配的视图,例如App.set('TodoControllerForPos9View',App.ToDoView')
  • 最后在路由器上调用connectOutlet,例如:router.get('groupController')。connectOutlet('pos9','todoControllerForPos9',App.ToDo.find(41)) 正如你可能猜到的,我自己也遇到了这个问题。我以前问过这个问题,这就是我想出的解决办法。我想,这是我余烬中缺失的一个功能。我称之为动态出口名称。见我原来的问题:

    看一下更新部分和这里提供的fiddle,您会发现这里提供了我的伪代码

    如果有人能看看我的解决方案,那就太好了,因为它目前仍然很粗糙,但对我来说似乎很有价值。希望这一点现在能通过这个大答案得到一些关注:-)

      connectOutlets: function(router, group) {
        router.get('applicationController').connectOutlet('group', group);
        router.get('groupController').connectOutlet('pos9', 'toDo', App.ToDo.find(41));
        router.get('groupController').connectOutlet('pos3', 'toDo', App.ToDo.find(15));