2016-11-04 2 views
0

Я использую инжектор поставщика, чтобы отправить команду из компонента Signin в компонент Profile, чтобы выйти. Хотя, журналы консоли показывают мне, что функция Signout работает должным образом, директивы (HTML) * ngIf не изменяются соответствующим образом.Как два разных компонента взаимодействуют друг с другом?

Что я делаю неправильно?

**Signin component** 

import {Component, OnInit, Injectable } from '@angular/core'; 

import {ProfileUserComponent} from '../profile.user.component/profile.user.component' 


@Component({ 
    selector: 'signin-button', 
    template: `<button (click)="onSignOut()" *ngIf="loggedIn === true " >Sign Out</button> 
<button (click)="onSignIn()" *ngIf="loggedIn !== true " >Sign In</button> 
`, 
    providers: [ProfileUserComponent] 


}) 




@Injectable() 
export class SigninComponent { 

loggedIn: boolean; 

constructor(public http: Http, private profileUserComponent: ProfileUserComponent){} 

     ngOnInit(): any{} 

onSignOut(): void{ 

// send command to the profile component 
this.profileUserComponent.signout(false);  

} 

} 





**ProfileUserComponent** 
import {Component, OnInit, Injectable} from '@angular/core'; 



    @Component({ 
      selector:'profile-user', 
      template: `<img class="ui mini image" src="image1.jpg" *ngIf="loggedIn === true"> 

    <img class="ui mini image" src="image2.jpg" *ngIf="loggedIn === false"> 

    `, 

    }) 

     signout(status){ 
     this.loggedIn = status; 
     console.log ("logged out", this.loggedIn); // Console log tells me that "Logged Out False" 
}  


} 

ответ

0

Весь ваш код необходимо переписать. Вы пытаетесь ввести один компонент в другой, что неверно. Вы вводите услуги в компоненты.

Если оба компонента ProfileUserComponent и SigninComponent должны быть компонентами с пользовательским интерфейсом, тогда вы можете создать общую службу, которая знает статус входа в систему и вводится в оба компонента. Один компонент может установить статус входа в свойстве службы (например, isSignedIn: EventEmitter), который отправит событие о состоянии входа в систему, а другой компонент будет прослушивать это событие.

На стороне примечания: @ Инъекционная аннотация не используется с компонентами.

+0

Привет Яков. Если я правильно понял вас, правильный способ создания * ProfileUserComponent - заставить компонент прослушивать изменения? Это другое, потому что теперь в Angular2 мы используем библиотеку Rxjs? –

+0

Если одновременно отображаются два компонента для брака, затем введите услугу и измените сервис, который запускает событие при каждой такой модификации. Если эта услуга вводится во второй компонент, она может подписаться на эти события: myCommonService.varOfTypeEventEmitter.subscribe(). Другой сценарий - с использованием маршрутизатора. Если второй компонент отображается в розетке маршрутизатора, он может подписаться на обновления от первого компонента, подписавшись на свойство params ActivatedRoute (его необходимо ввести во второй компонент). –

Смежные вопросы