Невозможно подписать данные объекта - PullRequest
0 голосов
/ 08 июня 2019

Я использую общий сервис для передачи данных, используя тему.В компоненте я пытаюсь подписать данные субъекта, но он никогда не подписывается

Я отправляю данные индекса через субъект в компоненте A, как показано ниже: компонент A

export class ComponentA {
  onEditTestCase(index: number){
    this.sharedService.startedEditing.next(index);
  }
}

Я используюобщий сервис для отправки индексных данных с использованием Subject.shared.service.ts

import { Subject } from 'rxjs/Subject';

export class SharedService {

constructor(private sharedService: SharedService, private router: Router) {}

  startedEditing = new Subject<number>();
}

В компоненте B я пытаюсь подписаться, но он никогда не подписывается.компонент B

import { Subscription } from 'rxjs';
export class ComponentB {
subscription: Subscription;

constructor(private router: Router, private sharedService: SharedService, 
  private route: ActivatedRoute) {}


ngOnInit() {
  this.subscription = this.sharedService.startedEditing
    .subscribe((index: number) => {
      this.editIndex = index;
      this.editMode = true;
      this.editedTestCase = this.sharedService.getTestCase(this.editIndex);
      this.testForm.setValue({
        testid: this.editedTestCase.testid,
        testPriority: this.editedTestCase.testPriority,
        testSummary: this.editedTestCase.testSummary
      });
    });
   }
 }

Я что-то не так делаю в приведенном выше коде?

Ответы [ 2 ]

1 голос
/ 08 июня 2019

Попробуйте использовать ReplaySubject вместо Subject.

. Попробуйте реализовать приведенный ниже код

common.setvice.ts

import { Injectable } from '@angular/core';
import {ReplaySubject} from 'rxjs/ReplaySubject';

@Injectable({
  providedIn: 'root'
})

export class CommonService {

  private startedEditing = new ReplaySubject<any>();
  public startedEditing$ = this.startedEditing.asObservable();
  constructor() { }

  setData(data) {
    this.startedEditing.next(data);
  }

}

a.compomnent.ts

import { Component } from '@angular/core';
import { CommonService } from './common.service'

@Component({ templateUrl: 'a.component.html' })
export class AComponent {
    constructor( 
        private commonService: CommonService
     ) { }

    ngOnInit() {
        this.commonService.setData('data from component A');
    }
}

b.component.ts

import { Component } from '@angular/core';
import { CommonService } from './common.service'

@Component({ templateUrl: 'b.component.html' })
export class BComponent {
    constructor( 
        private commonService: CommonService
     ) { }

    ngOnInit() {
        this.commonService.startedEditing$.subscribe(data => {
            console.log(data); // this will print "data from component A";
        });
    }
}

Дайте мне знать, если код выше не ясен.

0 голосов
/ 08 июня 2019

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

import { Subject } from 'rxjs/Subject';
export class SharedService {
private startedEditing = new Subject<number>();

public get StartEditing(): Observable<number> {
return this.startedEditing.asObservable();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...