我们如何将多个实例加载到模板中?

时间:2012-11-13 17:32:16

标签: ember.js

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

为了模拟这一点,我们有很多出路:

<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。

我是否以正确的方式接近这个并且是否可以以编程方式执行此操作,而不是使用固定的插座布局?

谢谢, 丹

1 个答案:

答案 0 :(得分:1)

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

问题有以下两行:

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”的控制器连接。将此控制器的内容设置为ToDo with Id 15(因此您将覆盖同一控制器的内容)。
  3. 结果是您最终将两个插座连接到控制器的同一个实例。并且您使用相同的ToDos,因为您已将此单个实例的content属性设置为两次。 核心问题来自我的观点:EmberJS默认使用单个控制器实例。
  4. 所以我的解决方案是为每个插座实例化一个新的Controller。不幸的是,这还需要修改View的查找。您可能知道,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));
    5. 正如您可能猜到的那样,我自己遇到了这个问题。之前我确实问过这个问题,这就是解决方案,我提出来了。我想,这是我遗嘱中缺少的一个功能。我称之为动态插座名称。请在此处查看我原来的问题:How to implement a list of multiple elements, where an element can be expanded by click? (Dynamic Outlet Names?)

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

      如果有人可以查看我的解决方案,那将会很棒,因为此刻它仍然是hacky,但对我来说似乎很有价值。希望这会得到一些关注: - )