Angular组件中的服务调用函数
Angular service call function in component
所以我知道您可以让两个不相关的组件通过服务相互通信,方法是让一个组件在服务中发出事件,而另一个组件在服务中订阅它。
我的问题:
服务是否可以直接调用组件中的函数?
默认情况下没有。服务是 class 的一个实例,仅此而已。
@Injectable()
class MyService {
}
@Component({
selector: 'my-component',
...
)}
class MyComponent {
constructor(private myService:MyService) {}
}
@NgModule({
providers: [MyService],
...
})
export class AppModule {}
通过这种方式,服务 (MyService
) 实例会传递给 MyComponent
,仅此而已。服务实例不知道 MyComponent
。
您可能想要的是向您的服务添加一个 Observable
并在您的组件中订阅它。
@Component({
selector: 'my-component',
...
)}
class MyComponent {
constructor(myService:MyService) {
myService.someObservable.subscribe(value => doSomething(value));
}
doSomething(value) {
console.debug(value);
}
}
这样,当 Observable
someObservable
发出另一个值时,服务 "calls" 组件上的一个方法。
有关详细信息,请参阅 detect change of nested property for component input
上面的答案是正确的,除了您没有 bootstrap 您的服务,您将在 app.module.
的提供者数组中添加您的服务
@NgModule({
declarations: [MyComponent],
imports: [],
providers: [MyService],
bootstrap: [AppComponent]
})
然后将服务注入组件
import { Component } from '@angular/core'
import { MyService } from './path/to/my.service'
...
export class MyComponent {
constructor(private myService:MyService){}
}
所以我知道您可以让两个不相关的组件通过服务相互通信,方法是让一个组件在服务中发出事件,而另一个组件在服务中订阅它。
我的问题:
服务是否可以直接调用组件中的函数?
默认情况下没有。服务是 class 的一个实例,仅此而已。
@Injectable()
class MyService {
}
@Component({
selector: 'my-component',
...
)}
class MyComponent {
constructor(private myService:MyService) {}
}
@NgModule({
providers: [MyService],
...
})
export class AppModule {}
通过这种方式,服务 (MyService
) 实例会传递给 MyComponent
,仅此而已。服务实例不知道 MyComponent
。
您可能想要的是向您的服务添加一个 Observable
并在您的组件中订阅它。
@Component({
selector: 'my-component',
...
)}
class MyComponent {
constructor(myService:MyService) {
myService.someObservable.subscribe(value => doSomething(value));
}
doSomething(value) {
console.debug(value);
}
}
这样,当 Observable
someObservable
发出另一个值时,服务 "calls" 组件上的一个方法。
有关详细信息,请参阅 detect change of nested property for component input
上面的答案是正确的,除了您没有 bootstrap 您的服务,您将在 app.module.
的提供者数组中添加您的服务@NgModule({
declarations: [MyComponent],
imports: [],
providers: [MyService],
bootstrap: [AppComponent]
})
然后将服务注入组件
import { Component } from '@angular/core'
import { MyService } from './path/to/my.service'
...
export class MyComponent {
constructor(private myService:MyService){}
}