Angular 2 订阅不工作
Angular 2 subscribe not working
由于超出此问题范围的原因,我不得不停止使用 @injectable
。我转换了使用它的服务,只是手动更新它们而不是使用 @injectable
它适用于所有服务,除了我使用 subscribe
的服务我使用订阅的服务在我不得不删除之前确实有效@injectable
。我可以在没有 @injectable
的情况下让它工作吗?
代码:
服务:
import { Subject } from 'rxjs/Subject';
export class ResultSelectionService {
// Observable string sources
private resultSelectedSource = new Subject();
// Observable string streams
resultSelected$ = this.resultSelectedSource.asObservable();
// Service message commands
selectResult(result: any, place: any) {
this.resultSelectedSource.next({result: result, place: place});
}
}
服务用户(selectResult 函数执行 - 好):
//arrow function because when called above "this" is an html element
resultClick = (event) => {
this.resultSelectionService.selectResult(event.data.result, event.data.place);
}
应该执行但没有执行的方法(代码永远不会进入 result => {
:
constructor( ) {
this.resultSelectionService = new ResultSelectionService();
this.resultSelectionService.resultSelected$.subscribe(
result => {
this.selectedResult = { result };
$('#result-details-modal').appendTo("body").modal('show');
$('#result-details-modal').on('shown.bs.modal', (e) => {
this.resizeMap();
this.canGetAddress = true;
this.addMarkersToMap(this.map);
//this.bindAutoCompleteToMap();
})
console.log(this.selectedResult.result);
});
}
我可以在不使用 @injectable
的情况下执行订阅的功能吗?如果没有,我该如何解决这个问题,创建类似的东西?
这里您需要的是 ResultSelectionService
的单个实例,这就是为什么您的订阅方法永远不会被调用的原因。
您需要在 ResultSelectionService
上添加 @Injectable()
,将其添加到您的 forRoot()
模块方法中(或者直接在 AppModule
的提供程序中添加,如果它是您唯一的模块有)并像那样使用它:
constructor( private resultSelectionService:ResultSelectionService ) {
this.resultSelectionService.resultSelected$.subscribe(
result => {
this.selectedResult = { result };
$('#result-details-modal').appendTo("body").modal('show');
$('#result-details-modal').on('shown.bs.modal', (e) => {
this.resizeMap();
this.canGetAddress = true;
this.addMarkersToMap(this.map);
//this.bindAutoCompleteToMap();
})
console.log(this.selectedResult.result);
});
}
这样一来,您将确保在您的应用中各处只提供一个 ResultSelectionService
实例,并且您将能够从任何地方触发 observable。
由于超出此问题范围的原因,我不得不停止使用 @injectable
。我转换了使用它的服务,只是手动更新它们而不是使用 @injectable
它适用于所有服务,除了我使用 subscribe
的服务我使用订阅的服务在我不得不删除之前确实有效@injectable
。我可以在没有 @injectable
的情况下让它工作吗?
代码:
服务:
import { Subject } from 'rxjs/Subject';
export class ResultSelectionService {
// Observable string sources
private resultSelectedSource = new Subject();
// Observable string streams
resultSelected$ = this.resultSelectedSource.asObservable();
// Service message commands
selectResult(result: any, place: any) {
this.resultSelectedSource.next({result: result, place: place});
}
}
服务用户(selectResult 函数执行 - 好):
//arrow function because when called above "this" is an html element
resultClick = (event) => {
this.resultSelectionService.selectResult(event.data.result, event.data.place);
}
应该执行但没有执行的方法(代码永远不会进入 result => {
:
constructor( ) {
this.resultSelectionService = new ResultSelectionService();
this.resultSelectionService.resultSelected$.subscribe(
result => {
this.selectedResult = { result };
$('#result-details-modal').appendTo("body").modal('show');
$('#result-details-modal').on('shown.bs.modal', (e) => {
this.resizeMap();
this.canGetAddress = true;
this.addMarkersToMap(this.map);
//this.bindAutoCompleteToMap();
})
console.log(this.selectedResult.result);
});
}
我可以在不使用 @injectable
的情况下执行订阅的功能吗?如果没有,我该如何解决这个问题,创建类似的东西?
这里您需要的是 ResultSelectionService
的单个实例,这就是为什么您的订阅方法永远不会被调用的原因。
您需要在 ResultSelectionService
上添加 @Injectable()
,将其添加到您的 forRoot()
模块方法中(或者直接在 AppModule
的提供程序中添加,如果它是您唯一的模块有)并像那样使用它:
constructor( private resultSelectionService:ResultSelectionService ) {
this.resultSelectionService.resultSelected$.subscribe(
result => {
this.selectedResult = { result };
$('#result-details-modal').appendTo("body").modal('show');
$('#result-details-modal').on('shown.bs.modal', (e) => {
this.resizeMap();
this.canGetAddress = true;
this.addMarkersToMap(this.map);
//this.bindAutoCompleteToMap();
})
console.log(this.selectedResult.result);
});
}
这样一来,您将确保在您的应用中各处只提供一个 ResultSelectionService
实例,并且您将能够从任何地方触发 observable。