服务值更新时在组件上运行功能(角度6)

时间:2018-10-19 19:55:37

标签: angular service

我正在创建具有以下结构的应用程序:

structure

当您单击MenuComponent中的项目时,它将向仪表板组件发射一个对象,然后将其从那里发送到OverViewComponent和UserComponent。他们依次在@Input()中运行一个函数,以根据接收到的数据获取各种数据,进而可以对其进行操作。

但是,我需要能够将外部包装中更改的数据保存在一起,并且由于我不想将数据发送回DashboardComponent,因此我选择使用带有共享变量的服务。这工作正常,除非我没有找到与@Input()类似的方法来在服务变量更改时在组件上运行函数。在菜单中选择新项目时,我需要它来获取新数据。我在SO上阅读了一些较早的文章,但是大多数文章都使用BehaviorSubject来订阅更改-但是,当服务中的变量发生更改时,我找不到任何在组件上运行功能的文章。顺便说一下,该变量是一个JSON对象。任何指针表示赞赏!

编辑:添加服务之前,我使用@Output从MenuComponent到DashboardComponent发出了值。我通过@Input通过DashboardComponent中的选择器收到了它:

<app-menu-component (emitGroup)="getGroup($event)"></app-menu-component>

然后我再次使用@Output通过选择器将其继续发送到UserComponent。

<app-user [group]="selectedGroup"></app-user>

然后,在UserComponent中,当数据更改时,我可以在@Input中运行一个函数,如下所示:

  @Input()
  set group(g) {
    this.selectedGroup = g;
    this.findUsers(this.selectedGroup); // this is what I want to achieve
  }

是否可以通过该服务执行类似的操作?

1 个答案:

答案 0 :(得分:2)

从问题及其描述中,我认为您想要这样的东西:

您可以创建这样的服务:

shared.service.ts

@Injectable()
export class SharedService {

mySubject : Subject<any> = new Subject<any>();
myData : any ;

myDataSetter(data : any){
 this.myData = data;
 this.mySubject.next(this.myData);
}

}

使用myDataSetter中的menucomponent设置更改的数据。

in your component subscribe to the subject in the service during the ``ngOnInit()`` this way : 

this._sharedService.mySubject.subscribe((data) => {
 //call my function
})