0

我们正在尝试构建一个门户,其中一个布局可以在主布局中以任意顺序包含任意数量的核心小部件。

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

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

{{outlet pos1}}
{{outlet pos2}}
{{outlet pos3}}
{{outlet pos4}}
{{outlet pos5}}
{{outlet pos6}}
{{outlet pos7}}
{{outlet pos8}}
{{outlet pos9}}
{{outlet pos10}}

在路由器中,我们尝试将它们一一加载:

  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));

但是,当有多个时,将使用最终上下文。所以在这个例子中,我们得到了 toDo 对象的两个实例,它们都是针对 id #15 的。

我是否以正确的方式处理这个问题,是否有可能以编程方式做到这一点,而不是拥有固定的网点布局?

谢谢,丹

4

1 回答 1

1

编辑:我的回答是基于您的情况确实需要这种复杂的解决方案的假设。根据您的简单示例,您还可以说,您可以对所有 ToDo 项目使用 ArrayController。但这是我对复杂问题答案的尝试:

问题是以下两行:

router.get('groupController').connectOutlet('pos9', 'toDo', App.ToDo.find(41));
router.get('groupController').connectOutlet('pos3', 'toDo', App.ToDo.find(15));

你基本上在那里做的是:

  1. 将名为 pos9 的插座与名为“todo”的控制器连接起来。将此控制器的内容设置为 Id 41 的 ToDo。
  2. 将名为 pos3 的插座与名为“todo”的控制器连接起来。将此控制器的内容设置为 Id 15 的 ToDo(因此您将覆盖同一控制器的内容)。
  3. 结果是您最终将两个出口连接到控制器的同一实例。和你相同的待办事项,因为你已经设置了这个单个实例的内容属性两次。从我的角度来看,核心问题是:EmberJS 默认使用单个控制器实例。

所以我的解决方案是为你拥有的每个插座实例化一个新的控制器。不幸的是,这也需要修改视图的查找。您可能知道,Controller 和 View 按名称匹配。所以粗略的算法将是伪代码:

  1. 创建新的Controller实例,例如: var newController = App.ToDoController.create();
  2. 将此控制器注入到具有适当名称的路由器中,例如 router.set('todoControllerForPos9', newController);
  3. 根据这个名称,你必须启用 Ember 才能找到匹配的视图,例如 App.set('TodoControllerForPos9View', App.ToDoView);
  4. 最后在路由器上调用connectOutlet,例如:router.get('groupController').connectOutlet('pos9', 'todoControllerForPos9', App.ToDo.find(41));

正如你可能猜到的,我自己也遇到了这个问题。我之前确实问过这个问题,这就是我想出的解决方案。我认为,这是我所缺少的功能。我称之为动态插座名称。在这里查看我的原始问题:如何实现多个元素的列表,其中一个元素可以通过单击展开?(动态插座名称?)

看看更新部分和那里提供的小提琴,你会认出我在这里提供的伪代码。

如果有人可以看看我的解决方案,那仍然很棒,因为它目前仍然很老套,但对我来说似乎很有价值。希望现在有了这个大答案,这会引起一些关注:-)

于 2012-11-13T18:11:50.817 回答