由于超出此问题范围的原因,我不得不停止使用@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函数执行 - Good):
//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
的情况下执行订阅功能?如果没有,我该如何解决这个问题?创造类似的东西?
答案 0 :(得分:3)
您需要的是ResultSelectionService
的单个实例,这就是为什么您的订阅方法永远不会被调用的原因。
您需要在@Injectable()
上添加ResultSelectionService
,将其添加到forRoot()
模块方法中(或直接添加到AppModule
的提供商中,如果它是&#39}。是你拥有的唯一模块)并使用它:
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
的一个实例,并且您可以从任何地方触发观察结果。