angular 服务中的 EventEmitter,好还是坏?
EventEmitter in angular services, good or bad?
我在 Angular 服务中使用 EventEmitter
和 @Output
,今天一位同事提到这不是一个好的做法。
我发现这个 mentioning it's a bad practice and it seems mostly is personal opinion, and this 提到可以使用它。
我找不到任何关于它的官方文件,所以如果有人知道官方答案,请post。
的官方文档
I was using EventEmitter and @Output in Angular services, today one of the coleagues mentioned it's not a good practice.
注解@Output()
在服务中无效。它用于告诉 Angular 模板编译器将 Observable
绑定到模板表达式。
如果我在服务中看到 @Output()
,我会告诉开发人员将其删除。
EventEmitter
是一个 Observable
,在服务中使用它没有副作用,但也没有好处。
您可以在组件或服务中使用任何 Observable
类型的发射器。我们有 EventEmitter
的原因有两个。 1) 它早于 Angular 团队承诺使用可观察对象的决定,他们认为他们可能需要自己的实现,2) 它可以在下一个 JavaScript 周期中发出值(可选设置)。
在某些边缘情况下,人们需要在下一个周期发出更改以避免更改检测出现问题。
保护您的 Observables
@Injectable()
export class MyService {
public events: Subject<any> = new Subject();
}
上述服务的问题是任何人都可以从 public events
发出值。您希望您的服务成为处理发射值的唯一代码。
@Injectable()
export class MyService {
private _events: Subject<any> = new Subject();
public get events(): Observable<any> {
return this._event.asObservable();
}
}
上面的更好,因为对 Subject.next(..)
的访问是私有的。消费者只能订阅可观察对象。
如果您遵循了 components 方法。它迫使你暴露你的发射器,这不是一个好主意。
@Injectable()
export class MyService {
@Output() // <<< has no effect
public events: EventEmitter<any> = new EventEmitter();
// ^^ makes the emitter public
}
如果要在模板中使用组件,组件需要具有 public 的属性,但服务不是这种情况。
我在 Angular 服务中使用 EventEmitter
和 @Output
,今天一位同事提到这不是一个好的做法。
我发现这个
I was using EventEmitter and @Output in Angular services, today one of the coleagues mentioned it's not a good practice.
注解@Output()
在服务中无效。它用于告诉 Angular 模板编译器将 Observable
绑定到模板表达式。
如果我在服务中看到 @Output()
,我会告诉开发人员将其删除。
EventEmitter
是一个 Observable
,在服务中使用它没有副作用,但也没有好处。
您可以在组件或服务中使用任何 Observable
类型的发射器。我们有 EventEmitter
的原因有两个。 1) 它早于 Angular 团队承诺使用可观察对象的决定,他们认为他们可能需要自己的实现,2) 它可以在下一个 JavaScript 周期中发出值(可选设置)。
在某些边缘情况下,人们需要在下一个周期发出更改以避免更改检测出现问题。
保护您的 Observables
@Injectable()
export class MyService {
public events: Subject<any> = new Subject();
}
上述服务的问题是任何人都可以从 public events
发出值。您希望您的服务成为处理发射值的唯一代码。
@Injectable()
export class MyService {
private _events: Subject<any> = new Subject();
public get events(): Observable<any> {
return this._event.asObservable();
}
}
上面的更好,因为对 Subject.next(..)
的访问是私有的。消费者只能订阅可观察对象。
如果您遵循了 components 方法。它迫使你暴露你的发射器,这不是一个好主意。
@Injectable()
export class MyService {
@Output() // <<< has no effect
public events: EventEmitter<any> = new EventEmitter();
// ^^ makes the emitter public
}
如果要在模板中使用组件,组件需要具有 public 的属性,但服务不是这种情况。