Angular 4执行另一个组件的功能

时间:2017-07-25 12:43:19

标签: angular

我正在使用Angular4构建一个webapp,我正在尝试创建一个按钮来调用其他组件上的函数。

我在这里阅读其他类似的问题,但他们有一个场景,其中组件是带有html声明的子组件或兄弟组件,例如:

<parent-component>
    <child-component></child-component>
    <sibling-component></sibling-component>
</parent-component>

但是,我正在处理不同的情况,因为我的组件是通过routing调用的,我无法使其正常工作。

基本上我在页面上有一个header,其中有一些控件来执行函数,但是这些函数需要触发/更改通过路由加载的其他组件上的数据。

例如,我有路由/store来显示商店列表,当用户点击标题上的按钮时,我还要在此页面上显示一个抽屉,这就是问题,因为我无法将事件从HeaderComponent传播到StoreComponent

这些是我的文件:

header.component.ts

@Component({
    selector: 'header',
    templateUrl: `
        <section class="container">
            <button (click)="clickFilter()">Open filter</button>
        </section>
    `
})

export class HeaderComponent {
    @Output() onFilter: EventEmitter = new EventEmitter();

    clickFilter():void {
        this.onFilter.emit('Register click');
    }
}

store.component.ts

@Component({
    templateUrl: 'store.html'
})

export class StoreComponent {
    onFilterClick(event) {
        console.log('Fire onFilterClick: ', event);
    }
}

// store.html
<article class="card" (onFilter)="onFilterClick($event)">
    Test
</article>

但这不起作用。

另外,我实际上不需要调用函数,我只能传递一个布尔值,例如,绑定到StoreComponent上的属性,然后在html文件中切换div。

2 个答案:

答案 0 :(得分:32)

我没有时间测试它,但类似的解决方案对我有用。根据您的需要创建的代码。

创建这样的服务

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Subject } from 'rxjs/Subject';

@Injectable()
export class MessageService {
    private _listners = new Subject<any>();

    listen(): Observable<any> {
       return this._listners.asObservable();
    }

    filter(filterBy: string) {
       this._listners.next(filterBy);
    }

}

然后在您的标题组件中实现,如此

// header.component.ts
@Component({
    selector: 'header',
    templateUrl: `
        <section class="container">
            <button (click)="clickFilter()">Open filter</button>
        </section>
    `
 })

export class HeaderComponent {
     @Output() onFilter: EventEmitter = new EventEmitter();

     constructor(private _messageService: MessageService){}
     clickFilter():void {
         // this.onFilter.emit('Register click');
         this._messageService.filter('Register click');
     }
 }

然后在您的商店组件中使用

@Component({
    selector: 'store',
    template: `<article class="card">
                 Test
              </article>`
})

export class StoreComponent {
    constructor(private _messageService: MessageService){
        this._messageService.listen().subscribe((m:any) => {
            console.log(m);
            this.onFilterClick(m);
        })
    }

    onFilterClick(event) {
        console.log('Fire onFilterClick: ', event);
    }
 }

这个概念是你可以在服务中使用observable并在你想要它的组件中订阅(store.component),并且可以像我在header.component中那样从app中的任何地方发送事件

我希望它能帮到你

答案 1 :(得分:3)

我有一个类似的情况,但不想为此提供服务。我设法像回调一样传递它。它会是这样的:

<强> header.component.ts

@Component({
selector: 'header',
templateUrl: `
    <section class="container">
        <button (click)="myFunction()">Open filter</button>
    </section>
`})
export class HeaderComponent {
   @Input() myFunction: Function;
}

然后只是调用它传递函数和参数

// store.html
<header [myFunction]="functionOnStore"></header>

只是在商店组件上正常声明functionOnStore