Javascript 如何检测来自不同组件的更改
我需要检测组件的变化 首先检查我的代码是否有效 这里的问题是,这被称为init,没有必要一直调用。。。您应该只在数据(响应)正常时调用更改Javascript 如何检测来自不同组件的更改,javascript,angular,Javascript,Angular,我需要检测组件的变化 首先检查我的代码是否有效 这里的问题是,这被称为init,没有必要一直调用。。。您应该只在数据(响应)正常时调用更改 ngOnInit() { this.calendarData(); } detectChangeUser(){ this.sharedService.selectedUserType$.subscribe( data => { i
ngOnInit() {
this.calendarData();
}
detectChangeUser(){
this.sharedService.selectedUserType$.subscribe(
data => {
if(data === 'changed-view-user-trigger'){
this.calendarData();
this.calendarUsers();
}
},
err => console.log(err)
)
}
我只需要在数据有响应时检测
也检查我的服务
export class SharedService {
public latestViewSwither: any = null;
selectedUserType$ = new BehaviorSubject<any>(this.latestViewSwither);
training$ = this.selectedUserType$.asObservable();
constructor(
private http: HttpClient
) { }
swithViewChanged(e){
this.latestViewSwither = e;
this.selectedUserType$.next(e);
}
}
导出类共享服务{
public latestViewSwither:any=null;
selectedUserType$=new BehaviorSubject(this.latestViewSwither);
training$=this.selectedUserType$.asObservable();
建造师(
私有http:HttpClient
) { }
swithViewChanged(e){
this.latestViewSwither=e;
此.selectedUserType$.next(e);
}
}
仅用于检测数据何时具有值
数据=='changed view user trigger'不必担心这一点。我只从另一个组件发送一个字符串…这并不重要。
唯一重要的是任何检测变化的钩子。。。我也尝试使用ngAfterViewChecked,但我的软件在此之后崩溃…您可以为此使用
行为主题。BehaviorSubject
具有存储“当前”值的特性。这意味着您始终可以直接从行为子对象
获取最后发出的值。
请参见下面的示例:
import * as Rx from "rxjs";
const subject = new Rx.BehaviorSubject();
// subscriber 1
subject.subscribe((data) => {
console.log('Subscriber A:', data);
});
subject.next(Math.random());
subject.next(Math.random());
// subscriber 2
subject.subscribe((data) => {
console.log('Subscriber B:', data);
});
subject.next(Math.random());
console.log(subject.value)
// output
// Subscriber A: 0.24957144215097515
// Subscriber A: 0.8751123892486292
// Subscriber B: 0.8751123892486292
// Subscriber A: 0.1901322109907977
// Subscriber B: 0.1901322109907977
// 0.1901322109907977
我想用那样的办法来解决这个问题
服务:
export class SharedService {
public latestViewSwither: any = null;
selectedUserType$ = new BehaviorSubject<any>(this.latestViewSwither);
training$ = this.selectedUserType$.asObservable();
constructor(private http: HttpClient) { }
swithViewChanged(e){
this.latestViewSwither = e;
if (!!e) {
this.selectedUserType$.next(e);
}
}
}
导出类共享服务{
public latestViewSwither:any=null;
selectedUserType$=new BehaviorSubject(this.latestViewSwither);
training$=this.selectedUserType$.asObservable();
构造函数(私有http:HttpClient){}
swithViewChanged(e){
this.latestViewSwither=e;
如果(!!e){
此.selectedUserType$.next(e);
}
}
}
它每次都会被调用,因为您在组件中使用了if
语句。您应该检查是否可以从您的服务发送响应,否则您的订阅将始终触发。作为旁注,您可以使用.pipe(filter(…)
仅触发当前数据的订阅。当您调用开关视图更改时
您应该放置一条if语句if(!!e)…
从主题调用下一个
。另外,您应该将您的主题设置为私有,并改为订阅asObservable()
属性。@CapitanFindus code帮助吗?@JorgeMussato我不知道该怎么做?@JorgeMussato您可以帮我提供代码吗?为什么不从“rxjs”中只导入主题导入{subject}
,那么subject=new subject
?好吧,我没听说过这个。你能提供我的代码示例吗?@Kavinda你能提供我当前代码的代码帮助吗?我不能理解你的例子