Subject.subscribe не стреляет в ngOnInit - PullRequest
0 голосов
/ 27 мая 2019

Я определил тему в моем service.ts onEditItem() в detail.component.ts передает значение id в .next(), и субъект подписывается в new.component.ts Но подписка не работает. Подписка осуществляется в ngOnInit в new.component.ts

Значение id успешно передано в onEditItem(), но подписка не работает. Я попытался сделать console.log проверить внутри подписки. Но в консоли ничего не печатается.

in details.component.html

<a class="btn btn-primary" (click)="onEditItem()" routerLink="/new">Edit</a>

in details.component.ts

  onEditItem(){this.contactService.startedEditing.next(this.id);}

in contactService.ts

export class ContactService {
  startedEditing =new Subject<number>();
}

in new.component.ts

ngOnInit() {
  this.subscription = this.contactService.startedEditing.subscribe(
    (index: number) => {
      console.log(index);

      this.editedItemIndex = index;
      console.log(this.editedItemIndex);
      this.editMode = true;
      this.editedItem = this.contactService.getContacts(index);

      this.editForm.setValue({
        name: this.editedItem.name,
        address: this.editedItem.address
      })
    }
  );
} 

Я ожидал, что форма, определенная в new.component.html, должна быть инициализирована с помощью компонента value from details, но подписка не работает в ngOnInit.

Ответы [ 3 ]

2 голосов
/ 27 мая 2019

Субъекты должны выдавать значение, чтобы наблюдатели действовали на событие.

Это означает, что вы должны либо щелкнуть по вашему Div, либо переключиться на BehaviorSubject, который возвращает последнее значение потока при подписке.

0 голосов
/ 27 мая 2019

Субъект представляет собой гибридную версию наблюдаемой и наблюдателя. Таким образом, он покажет оба поведения, и нет необходимости создавать отдельные наблюдаемые.

Я создал простой стекбитц для вашего вопроса. Пожалуйста, отметьте (https://stackblitz.com/edit/angular-ypeadt) надеюсь, это поможет. Ура!

0 голосов
/ 27 мая 2019

Вам нужно поменять свой сервис

startedEditing =new Subject<number>();
startedEditing$: Observable<any> = this.startedEditing.asObservable();

и

 shareData(data)
  {
    this.startedEditing.next(data)
  }

и в вашем details.component.ts

 onEditItem(){
  this.contactService.shareData(this.id)
  }

инаконец в new.component.ts

ngOnInit() {
  this.contactService.startedEditing$.subscribe(res=>{ 
 console.log(res)// you can get the data here
}

вот и все

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...