【问题标题】:Implementing 'Master - detail' with router (router outlet) in Angular2在 Angular2 中使用路由器(路由器出口)实现“主 - 详细信息”
【发布时间】:2016-11-16 13:49:15
【问题描述】:

我正在使用 Angular2 路由器实现主从屏幕。 我有一个组件,它在其模板中定义了一个资源列表(ul/li 格式):Master part。列表中的每个资源都可以通过“routerLink”绑定单击。

在同一个模板中,我定义了一个路由器插座。这个想法是:当我单击列表中的一个资源 (ul/li) 时,Angular2 应该在路由器出口处显示/呈现一个可编辑的表单。我可以更改数据并按保存按钮。 (细节部分)

当这个资源被更新(保存)时,我希望资源列表(ul/li)也被更新,因为可能有一些数据已经改变,它也显示在资源列表中(例如资源显示名称) .

由于 Angular2 正在管理细节组件,我没有在我的 html 模板中声明该组件。但是,因为我没有声明细节组件,所以我没有对事件做出反应的钩子(比如更改事件)。也就是说,当我的表单成功更改时,我会发出一个“更改事件”。基于这样的事件,我可以在“主控部分”实现一个处理程序,以便主控可以通过刷新资源列表 (ul/li) 来更新自己。

关键是:由于在我的应用中引入了 Angular2 路由器功能,我失去了主组件和详细组件之间的关系。

问题:有没有办法解决这种模式?

【问题讨论】:

  • 请添加一些代码来帮助。
  • 嗨,Madhu,我会更简洁地重新表述我上面描述的问题;-)
  • 嗨,Madhu,我将更简洁地重新表述我上面描述的问题 ;-) 你有可能在路由器出口组件“中”呈现的组件通知(父)组件它已经改变? |通常您会发出一个事件,并且父级可以对其做出反应。在这种情况下,router-outlet 是需要渲染的组件(在路由配置中声明)的“占位符”。由于组件本身(在 html 模板中)不存在,因此我无法声明父级或其他人可以对其做出反应的任何事件绑定。
  • 我想你正在寻找Component communicate via a service,希望这会有所帮助!!
  • 嗯..我理解你的想法......但是..我希望在组件之间有一种更直接的通信方式/或者通过事件发射松散地进行通信。我首先通过使用兄弟姐妹组件关系来获得另一个解决方案。嗯,它实际上是通过共同父母进行的兄弟姐妹之间的沟通。我可以使用输入绑定来传递数据和输出绑定来传递事件。但是这种方法的问题(对于我的用例)是我希望地址导航栏中的 URL 也随着每次交互而改变。这就是我探索路线解决方案的原因。

标签: angular angular2-routing angular2-template


【解决方案1】:

理想的方式是使用,Component communication via a service

你也可以试试下面,

import { Component , Output, EventEmitter} from '@angular/core';

@Component({
  selector: 'my-app',
  template: `Angular Route
   <hr />
    <a routerLink="/child1" >Child 1</a>
    <a routerLink="/child2" >Child 2</a>
  <hr />
     Inside Parent component
     <br />
     <br />
     Subscription from child : {{result | json}}
  <hr />
  <div> Child Component</div>
  <br />
  <router-outlet
  (activate)='onActivate($event)'
  (deactivate)='onDeactivate($event)'></router-outlet>
  `
})
export class AppComponent {
  result: any = {};

  constructor(){
  }

  childSubscription: any;

  onActivate($event){
     if(!!$event['parentNotifier']){
       this.childSubscription = $event['parentNotifier'].subscribe(res => {
          this.result = res;
       });
     }
  }

  onDeactivate($event){
    if(!!this.childSubscription){
      this.childSubscription.unsubscribe();
    }
  }
}

@Component({
  selector: 'my-app',
  template: `I am a child
  <button (click)='clickMe()' >Click me to notify parent</button>
  `
})
export class ChildComponent1 {
   @Output() parentNotifier:EventEmitter<any> = new EventEmitter<any>();

   clickMe(){
     this.parentNotifier.next('I am coming from child 1!!');
   }
}

@Component({
  selector: 'my-app',
  template: `I am a child
  <button (click)='clickMe()' >Click me to notify parent</button>
  `
})
export class ChildComponent2 {
   @Output() parentNotifier:EventEmitter<any> = new EventEmitter<any>();

   clickMe(){
     this.parentNotifier.next('I am coming from child 2!!');
   }
}

但请注意,事件的名称需要父母知道,就像在上面的示例中一样,我直接使用了它parentNotifier

这里是Plunker!!

希望这会有所帮助!

【讨论】:

  • 谢谢,马杜。顺便说一句,我通过服务检查并尝试了您以前的建议。再想一想,我喜欢这种方法,因为 Redux 离我只有一步之遥,也就是说,如果我遵循这种方法,我在概念上就可以使用 Redux。因此,也值得尝试服务方法。感谢您的见解!
  • @user2120188:酷,我已经更新了答案,你可以接受。
猜你喜欢
  • 1970-01-01
  • 2021-09-14
  • 1970-01-01
  • 1970-01-01
  • 2020-05-11
  • 2020-09-04
  • 2017-02-15
  • 1970-01-01
  • 2016-09-20
相关资源
最近更新 更多