2016-10-07 5 views
0

По причинам, выходящим за рамки этого вопроса, мне пришлось прекратить использование @injectable. Я преобразовал свои сервисы, которые его используют, просто вручную обновляя их, а не используя @injectable, и он работает для всех служб, кроме моей службы, которая использует subscribe. Моя служба, которая использует подписку, работала до того, как мне пришлось удалить @injectable. Могу ли я заставить его работать без @injectable?.Угловая 2 подписаться не работает

Код:

Услуги:

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? Если нет, как я могу обойти это, создав нечто подобное?

+2

Эти вещи абсолютно не связаны. Вы должны попытаться настроить свою установку. '@Injectable()', как известно, не вызывает никаких проблем. –

+0

Отношения между вызывающим абонентом 'selectResult' и вызывающим 'resultSelected $ .subscribe' в вашем вопросе не совсем понятны. Являются ли они в одном компоненте? Ваше утверждение о том, что вам пришлось прекратить использовать '@ Injectable', касается и предлагает проблему в другом месте. – cartant

+0

@ GünterZöchbauer Что вы предлагаете мне сделать, чтобы настроить мою установку? Я попробовал ваше единственное предложение – BeniaminoBaggins

ответ

3

Что вам нужно здесь, это один экземпляр ResultSelectionService, поэтому ваш метод подписки никогда не вызывается.

Вам нужно добавить @Injectable() на ResultSelectionService, добавьте его в вашем методе модуля forRoot() (или непосредственно в поставщиках AppModule «s, если это единственный модуль у вас есть) и использовать его так:

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, и вы сможете запускать наблюдаемое из любого места.

Смежные вопросы