2016-07-22 2 views
0

Я пытаюсь использовать Observable и ChangeDetectionStrategy, чтобы сообщить другим компонентам об изменениях. К сожалению объект Observable addItemStream не определен. Что здесь не так?Угловой 2. Наблюдаемый не определен

import { Component, ChangeDetectionStrategy, ChangeDetectorRef, Input }   from '@angular/core' 
import { ROUTER_DIRECTIVES, Router } from '@angular/router'; 
import {Observable} from 'rxjs/Observable'; 

@Component({ 
    selector: 'bp-header', 
    templateUrl: 'app/header.component.html', 
    directives: [ROUTER_DIRECTIVES], 
    changeDetection: ChangeDetectionStrategy.OnPush 
}) 
export class HeaderComponent { 
    @Input() addItemStream: Observable<any>; 
    public isActive: number; 
    public language: string = "en"; 
    constructor(private cd: ChangeDetectorRef) {} 
    ngOnInit() { 
     this.isActive = 1; 
    } 
    ngAfterViewInit() { 
    this.addItemStream.subscribe(() => { 
     this.setLanguage; // application state changed 
     this.cd.markForCheck(); 
     }) 
    } 
    public setLanguage = (language: string) => { 
     if (this.language === language) { return } 
     else { this.language = language }; 
    } 
    public setActive(active: number) { 
     if (this.isActive === active) return; 
     this.isActive = active; 
    } 
} 

ответ

2

Вы подписавшись на Observable в ngOnInit. Поскольку InputObservable (и все остальные Inputs) будет undefined в этом пункте.

Попробуйте подписаться на него в ngAfterViewInit. Альтернативно, поставьте сервис. Это делает вашу жизнь (и разделение Observable) намного проще.

+0

ли вы имеете в виду это: ngAfterViewInit() { this.addItemStream.subscribe (() => { this.setLanguage this.cd.markForCheck(); }) } –

+0

Я обновил свой код выше, но есть такая же ошибка. –

+0

Он должен работать, но это зависит от того, когда и где вы создаете Observable. Без дополнительного контекстного кода трудно сказать, в чем проблема. В любом случае: я бы рекомендовал разместить Observable в службе. Это лучшее решение. – hholtij

0

Не имеет значения, где вы подпишитесь на него. Обычно я делаю это в конструкторе. Однако, когда компонент инициализирует первый поток не определен так просто инициализировать его в конструкторе:

constructor(private cd: ChangeDetectorRef) { 
    this.addItemStream = new Observable<any>(); 
} 
+0

Если Observable передается компоненту в качестве входа, это определенно имеет значение. Если вы попытаетесь подписаться на него, когда он еще не определен, он просто не будет работать. – hholtij

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