在 Angular 6 中从一个组件导航到另一个组件时,主题不工作
Subject is not working when route navigating from one component to another component in Angular 6
我有组件 A、组件 B 和一项服务。我在服务中声明了 Subject 并在组件 B 中订阅了 Subject。在导航到组件 B 之前,我正在将一些数据从组件 A 发送到 Subject。它正在导航到组件 B,但 Subscribe 方法没有触发。
服务:
@Injectable({
providedIn: 'root'
})
export class ServiceTestService {
storage: Recipe;
recipeSelected = new Subject<any>();
constructor() { }
}
组件 A 发送消息到 observable
@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中触发。请建议。
改用BehaviorSubject
,这样您始终可以获得在新订阅之前发出的当前值(最新)。
如果您使用 Subject
,那么您只会获得订阅后发出的值。
export class ServiceTestService {
storage: Recipe;
recipeSelected = new BehaviorSubject<any>();
constructor() { }
}
感谢@Amit 的想法。我使用了 ReplaySubject(1)
,它运行良好。
recipeSelected = new ReplaySubject<any>(1);
我有组件 A、组件 B 和一项服务。我在服务中声明了 Subject 并在组件 B 中订阅了 Subject。在导航到组件 B 之前,我正在将一些数据从组件 A 发送到 Subject。它正在导航到组件 B,但 Subscribe 方法没有触发。
服务:
@Injectable({
providedIn: 'root'
})
export class ServiceTestService {
storage: Recipe;
recipeSelected = new Subject<any>();
constructor() { }
}
组件 A 发送消息到 observable
@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中触发。请建议。
改用BehaviorSubject
,这样您始终可以获得在新订阅之前发出的当前值(最新)。
如果您使用 Subject
,那么您只会获得订阅后发出的值。
export class ServiceTestService {
storage: Recipe;
recipeSelected = new BehaviorSubject<any>();
constructor() { }
}
感谢@Amit 的想法。我使用了 ReplaySubject(1)
,它运行良好。
recipeSelected = new ReplaySubject<any>(1);