Javascript 如何检测来自不同组件的更改

Javascript 如何检测来自不同组件的更改,javascript,angular,Javascript,Angular,我需要检测组件的变化 首先检查我的代码是否有效 这里的问题是,这被称为init,没有必要一直调用。。。您应该只在数据(响应)正常时调用更改 ngOnInit() { this.calendarData(); } detectChangeUser(){ this.sharedService.selectedUserType$.subscribe( data => { i

我需要检测组件的变化

首先检查我的代码是否有效

这里的问题是,这被称为init,没有必要一直调用。。。您应该只在数据(响应)正常时调用更改

  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你能提供我当前代码的代码帮助吗?我不能理解你的例子