Тема не работает при навигации по маршруту от одного компонента к другому компоненту в Angular 6 - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть Компонент A, Компонент B и сервис.Я объявил Subject в сервисе и подписал Subject в компоненте B. И я отправляю некоторые данные из компонента A в Subject перед переходом к компоненту B. Он перемещается к компоненту B, но метод Subscribe не запускается.

Служба:

@Injectable({
  providedIn: 'root'
})
export class ServiceTestService {
storage: Recipe;
recipeSelected = new Subject<any>();
constructor() { }

}

Компонент A Отправка сообщения наблюдаемой

@Component({
  selector: 'app-recipe-item',
  templateUrl: './recipe-item.component.html'
 })

export class RecipeItemComponent implements OnInit {

@Input() recipe: Recipe;

  constructor(
     private recipeService: ServiceTestService,
     private rt: Router) { }

  ngOnInit() {
  }

  onRecipeSelected(name: number) {

this.recipeService.recipeSelected.next(this.recipe);
this.rt.navigate(['/recipe', this.ind]);

  }
}

Компонент B: Здесь я подписался на Observable.

@Component({
  selector: 'app-recipe-detail',
  templateUrl: './recipe-detail.component.html',
  styleUrls: ['./recipe-detail.component.css']
  })

export class RecipeDetailComponent implements OnInit, OnDestroy {
  recipe: Recipe;

  constructor(private recipeService: ServiceTestService) { }

ngOnInit() {

this.recipeService.recipeSelected.subscribe(

  (res: any) => {
    console.log(`Recipe Component ${res}`); }
);

}

}

Он перемещается от Компонента A к Компоненту B, но метод подписки не запускается в Компоненте B. Пожалуйста, предложите.

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Спасибо за идею @Amit.Я использовал ReplaySubject(1), и он работает отлично.

recipeSelected = new ReplaySubject<any>(1);
0 голосов
/ 11 февраля 2019

Вместо этого используйте BehaviorSubject, чтобы вы всегда получали текущее значение (последнее), которое было отправлено до новой подписки.

Если вы используете Subject, то вы получите только значения, которые выдаются после подписки.

export class ServiceTestService {
   storage: Recipe;
   recipeSelected = new BehaviorSubject<any>();
   constructor() { }
}

Разница между Subject и BehaviorSubject

...