角度4中两个同胞组件之间的变量共享?

问题描述:

我有2个兄弟组件,我想访问另一个组件中要访问的一个组件的变量。我使用共享服务,但它不起作用。你能告诉我我的错在哪?角度4中两个同胞组件之间的变量共享?

服务:

@Injectable() 
export class SharedService{ 
    private isSuccess = new Subject<boolean>(); 
    getSaveBtnStatus(){ 
    return this.isSuccess.asObservable(); 
    } 
    setSaveBtnStatus(value: boolean){ 
    this.isSuccess.next(value); 
    } 
} 

组件1:

@Injectable() 
export class LoginComponent implements OnInit { 
    constructor(private http: Http, private route: ActivatedRoute, private router: Router, private myshared: SharedService) { 
    } 

    ngOnInit() {  
    } 

    login = (user) => { 
    var username = user.username; 
    var password = user.password; 
    var user_api , user_birth ; 
    var url = 'https://swapi.co/api/people/?search='+username; 
    this.http.get(url).subscribe(data => { 
     var count = data.json().count; 
     if(count == 0)alert("NO such user"); 
    if(count > 0) { 
     user_api= (data.json().results[0].name); 
     user_birth = (data).json().results[0].birth_year; 
     if(password == user_birth && username == user_api) { 
     console.log("Successful"); 
     this.myshared.setSaveBtnStatus(true);// using shared service 
     this.router.navigate(['/search']); 
    } else if (password != user_birth || username != user_api) 
     alert("CHECK Your Username and Passowrd"); 
    } 
    }) 
    } 
} 

子项目2:

export class SearchPlanetComponent implements OnInit { 
    form; 
    private loading: boolean = false; 
    private results: Observable<Array<String>>; 
    public searchField : FormControl 
    private isSuccess :Boolean 
    constructor(private myservice: SearchService, 
    private myshared:SharedService, private http: Http) { 
    } 
    ngOnInit() { 
    this.myshared.getSaveBtnStatus(). 
     subscribe(
     data => console.log(data) // nothing is printed in console. 
    ); 
} 

请告诉为什么服务功能的get/set不工作?

+0

请问您可以创建一个plunker吗? – Rama

它不起作用,因为当您在主体内发出值时,底层组件假设要侦听的值未加载。调用router.navigate后,该组件正在加载。

您应该考虑使用BehaviorSubject而不是Subject,因为BehaviourSubject坚持最后发出的值。当有人订阅它时,它也会发出持久的值。

//it needs initial state while registering it, so passed false 
private isSuccess = new BehaviorSubject<boolean>(false);