【问题标题】:Angular 10,router-outlet output with EventEmitter to parent in SideNav ContentAngular 10,带有 EventEmitter 的路由器出口输出到 SideNav 内容中的父级
【发布时间】:2021-03-14 05:40:43
【问题描述】:

我有一个布局页面,其中包含 mat-sidenav-container 和路由器插座。我尝试调用该函数并将数据从路由器插座页面通过 EventEmitter 传递给 LayoutPage,但它不起作用。 我在这里发现了与我类似的问题: @Output with EventEmitter from child to parent, view doesn't update in parent

如果将router-outlet标签替换为组件选择器标签(app-child)是可行的,但是router-outlet标签对我来说是必要的。我需要通过router-outlet标签导航网页。那我该怎么办?

layout.component.html

<mat-sidenav-container>
    <mat-sidenav #sideNav opened="true" mode="side" class="sidebar" style="background-image: url('assets/images/test.png');">
      <ul class="nav">
        <li routerLinkActive="active" *ngFor="let menuItem of menuItems" class="test nav-item">
            <a class="nav-link" [routerLink]="[menuItem.path]" [queryParams]="filter">
                <i class="material-icons">{{menuItem.icon}}</i>
                <p>{{menuItem.title}}</p>
            </a>
        </li>
    </ul>
    </mat-sidenav>
  
    <mat-sidenav-content class="content">
        <app-header></app-header>
      <router-outlet (onDatePicked)='doSomething($event)' > </router-outlet>
      
    </mat-sidenav-content>
  </mat-sidenav-container>

layout.component.ts

@Component({
  selector: 'app-layout',
  templateUrl: './layout.component.html',
  styleUrls: ['./layout.component.css']
})
export class ChemoLayoutComponent implements OnInit {

  filter:Filter
  menuItems: any[];
  constructor(private route: ActivatedRoute,private app: ApplicationRef) {
    this.menuItems = [
      { path: '/chemo/child', title: 'aaa',  icon: 'library_books' },
      { path: '/chemo/child1', title: 'bbb',  icon:'build'},
      { path: '/chemo/child2', title: 'ccc',  icon:'search' },
  ];
  this.filter = new Filter();
   }

  ngOnInit(): void {
    this.route.queryParams.subscribe((params) => {
      this.filter.CHARTNO = params['CHARTNO'];
    });
  }

  doSomething($event){  //<== It's not working
    this.app.tick();
    console.log("Test");
  }
}

child.component.ts

@Component({
  selector: 'app-child',
  templateUrl: './child.component.html',
  styleUrls: ['./child.component.css']
})
export class ChildComponent implements OnInit {

  @Output() onDatePicked: EventEmitter<any> = new EventEmitter<any>();
  constructor() {

   }
  ngOnInit(): void {
  this.onDatePicked.emit("hello");
}
}

【问题讨论】:

    标签: angular angular10


    【解决方案1】:

    &lt;router-outlet (onDatePicked)='doSomething($event)' &gt; &lt;/router-outlet&gt;

    这不起作用,因为RouterOutlet 上不存在onDatePicked 输出(参见Angular doc)。

    如果你想在不受路由限制的情况下从子组件到父组件通信,你需要实现一个服务。它可能看起来像这样:

    child-to-parent.service.ts

    @Injectable({
      providedIn: 'root'
    })
    export class ChildToParentService {
    
      onDatePicked$ = new Subject<any>();
    
      constructor() { }
    
    }
    

    layout.component.ts

    @Component({
      selector: 'app-layout',
      templateUrl: './layout.component.html',
      styleUrls: ['./layout.component.css']
    })
    export class ChemoLayoutComponent implements OnDestroy {
    
      onDatePickedSub: Subscription;
    
      constructor(
        private childToParentService: ChildToParentService
      ) {
        this.onDatePickedSub = this.childToParentService.onDatePicked$.subscribe($event => {
          this.doSomething($event);
        });
      }
    
      ngOnDestroy(): void {
        if (this.onDatePickedSub) {
          this.onDatePickedSub.unsubscribe();
        }
      }
    
      doSomething($event): void {
        this.app.tick();
        console.log("Test");
      }
    
    }
    

    child.component.ts

    @Component({
      selector: 'app-child',
      templateUrl: './child.component.html',
      styleUrls: ['./child.component.css']
    })
    export class ChildComponent implements OnInit {
    
      constructor(
        private childToParentService: ChildToParentService
      ) { }
    
      ngOnInit(): void {
        this.childToParentService.onDatePicked$.next('hello');
      }
    
    }
    

    【讨论】:

      猜你喜欢
      • 2016-07-06
      • 2019-04-15
      • 2017-08-08
      • 2017-07-04
      • 1970-01-01
      • 2023-03-12
      • 2021-01-31
      • 1970-01-01
      • 2022-10-21
      相关资源
      最近更新 更多