2016-05-12 2 views
3

Я использую угловой 2 rc1 и новый маршрутизатор @ угловой/маршрутизаторУгловое 2 обновление компонентов приложения от выпускного маршрутизатора компонента

В приложении компонента У меня есть раздел нав и выход маршрутизатора

<nav> 
    <a *ngIf="auth?.userName == null" [routerLink]="['/login']">Login</a> 
    <a *ngIf="auth?.userName != null" (click)="logout()">Logout</a> 
    {{auth?.userName}} 
</nav> 
<router-outlet></router-outlet> 

I впрыснуть loginService в приложении компонент и подписаться на событие в ngOnInit

ngOnInit() { 
    this.loginService.loginSuccess.subscribe(this.loginSuccess); 

} 
ngOnDestroy() { 
    this.loginService.loginSuccess.unsubscribe(); 
} 
private loginSuccess(res: IAuthResponse) { 
    this.auth = res; 
} 

, когда я перейти к моей «/ вход в системе» маршрута странице/компонент моего loginService является инъекционным и loginService определяет событие

@Output() loginSuccess = new EventEmitter<IAuthResponse>(); 

и после успешного входа в моей службе, служба Логина вызывает событие

this.loginSuccess.next(response); 

Я могу установить точку останова в приложении компонента на подписном loginSucess и передаются данные Вместе с тем, «это» не определено.

private loginSuccess(res: IAuthResponse) { 
    this.auth = res; //this is undefind 
} 

как я могу обновить компонент приложения от событий, которые triggerd от услуг, используемых в компонентах, которые размещаются на выходе маршрутизатора

ответ

2

Не уверен, что вы имеете в виду «а данные передаются».

@Output() loginSuccess = new EventEmitter<IAuthResponse>(); 

в компоненте добавленного маршрутизатора (LoginComponent) ничего не делает. @Input() и @Output() в маршрутизированных компонентах не поддерживаются.

Просто введите LoginService в перенаправленный компонент и испустите событие, используя наблюдаемый в компоненте входа.

@Injectable() 
export class LoginService { 
    changes:BehaviorSubject = new BehaviorSubject(false); 
} 
export class LoginComponent { 
    constructor(private loginService:LoginService) {} 

    onLogin() { 
    this.loginService.changes.next(true); 
    } 
} 
export class NavComponent { 
    constructor(private loginService:LoginService) {} 

    onLogin() { 
    this.loginService.changes.subscribe(status => this.isLoggedIn = status); 
    } 
} 
+0

Я ввожу loginService в loginComponent, и loginService имеет значение @output eventEmitter. Когда событие поднимается из службы входа в систему, компонент приложения получает событие с данными (IAuthResponse), но «это» в компоненте приложения равно null/undefined. –

+0

Ок, 'EventEmitter' должен использоваться только в компонентах. '@Output()' в сервисе не имеет смысла.У вас есть 'function()' вместо '() =>' в любом месте вашего кода или вы передаете функцию где угодно? –

+0

change @output() EventEmitter от моего сервиса до SubjectBehavior привел к правильному поведению, которое я искал. спасибо за разъяснение того, когда/где использовать выходной атрибут. –

0

Это похоже, что это может быть решением моей проблемы: передача событий от ребенка к родителю, который использует маршрутизатор-выход, однако он выглядит как RC1 изменилось, как BehaviorSubject работает. Используя описанный выше метод:

changes:BehaviorSubject = new BehaviorSubject(false); 

дает ошибку говоря BehaviorSubject нуждается в декларации типа, поэтому я попытался как

changes:BehaviorSubject<boolean> = new BehaviorSubject(false); 
    as well as 
changes:BehaviorSubject<any> = new BehaviorSubject(false); 

и отлично компилируется, но при запуске приложения, оно дает шаблонным ошибка:

zone.js:323 SyntaxError: Unexpected token < 
Evaluating http://localhost:3000/node_modules/rxjs/index.js 
Error loading http://localhost:3000/app/main.js 
at SystemJSLoader.__exec 
(http://localhost:3000/node_modules/systemjs/dist/system.src.js:1395:16) 
at entry.execute 

Я предполагаю, что что-то изменилось с rxjs и BehaviorSubject

+0

Это не относится к 'BehaviorSubject'. Первое сообщение об ошибке - это некоторые параметры настройки проверки статического типа (я не знаю подробностей здесь, потому что я сам использую Дарт). Второе сообщение об ошибке также связано с настройкой вашего проекта. Пожалуйста, не добавляйте дополнительные ответы в качестве ответов. Скорее создайте новый вопрос со ссылкой на тот, на который вы распространяетесь. –

+1

Я узнал, что это такое, они переместили местоположение BehaviorSubject. Раньше он находился под rxjs/subject/BehaviorSubject, теперь его в rxjs/BehaviorSubject, который его исправил. Кроме того, они (Stackoverflow) не позволяют мне добавлять комментарии к другим сообщениям, потому что мне нужен рейтинг 500 или что-то в этом роде, но они позволяют отвечать на сообщения ... go figure – Shar

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