2017-01-04 41 views
1

我有一个需要互动的父组件和子组件。通常我会用contextual components。我这种情况不起作用,因为这两个组件不在相同的路由模板上。父组件位于一条路径上,子组件位于子路由上,据我所知,我无法将上下文组件传递给{{outlet}}。ember.js - 如何连接不同路由上的两个组件?

Route  | Component 
---------------------------- 
route  | parentComponent 
route.sub | childComponent 

我目前看到两个选项:

  1. 移动父组件逻辑控制器
  2. 使用服务

我想,以避免这两个选项,因为相同的父子组件可能会同时显示两次。在这两种情况下,我都没有看到使用某种ID将正确的孩子与正确的父母连接的其他选项,我不喜欢那样,因为我发现很难调试和阅读。

 Controller/Service 
     ∧    | 
     |    ∨ 
     action()  ? or ? -> use of ID 
     ∧   |  | 
     |   ∨  ∨ 
child child  parent parent 

有没有其他方法可以做到这一点? 感谢您的帮助!

回答

4

简而言之,不可能在不使用您提供的两个选项的情况下实施解决方案。

我相信你提到的组件并没有展现出恰当的亲子关系,因为父母生活在一个根和孩子生活在另一条路线。

假设TemplateA - 有{{comp-a}}{{comp-b}} - 这被称为兄弟组件。这里comp-b无法与comp-a通信,但可以通过向公共控制器/路由发送操作。

假设TemplateA - 有{{comp-a }}和内部comp-a具有{{comp-b}} - 这就是所谓的父子组成部分,在这里子组件(comp-b)可向父组件comp-a通信。

组件将通过冒泡动作进行通信,动作逻辑应该在数据的源/所有者中实现。

在你的情况,答案取决于谁是数据的所有者,

1.如果组件不是同一嵌套层次路由使用,然后我欲为数据所有权服务。
2.如果两个组件在相同的嵌套路由层次结构中使用,那么我更愿意将数据所有权授予控制器/路由 ,即,
父路由 - >将加载数据并将所需数据传递给父组件。
parent-route.sub - >从父路由获取子组件所需的数据(可以使用modelForcontrollerFor方法)并传递子组件。现在子组件可以从这里触发动作,直到应用程序路径进行通信。

+0

感谢您的详细反馈。 –

+0

我怀疑那个。在我的情况下,父和子组件不能使用相同的数据。他们只需要以如何展示和装饰材料为目的进行沟通。我想我然后去控制器/路线选项。并尽可能在查询参数中移动。 –