以下は、Observablesを使用して、親コンポーネントから子コンポーネントに値を伝えることです。これを修正する助けがあれば幸いです。Observablesで値の変更を伝達するのに役立つ必要があります
import { Component } from '@angular/core';
import { Observable } from 'rxjs/Observable';
import { Observer } from 'rxjs/Observer';
import { ViewModel } from './ViewModel.data';
import { ViewComponent } from './ViewComponent.component';
@Component({
selector: ...,
directives: [
ROUTER_DIRECTIVES,
ViewComponent
],
precompile: [],
styles: [],
template: `
<div>
<ul class="nav nav-tabs">
<li *ngFor="let v of views"><a (click)="setView(v)">{{ v.name }}</a></li>
</ul>
<viewcomponent
*ngFor="let v of views"
[viewName]="v.name"
[activeViewObservable]="activeViewObservable"></viewcomponent>
</div>
`
})
export class AppComponent{
views:ViewModel[];
activeViewObservable:Observable<ViewModel>;
viewObserver:Observer<ViewModel>;
activeView:ViewModel;
constructor() {
this.views = [{name: 'one'}, {name: 'two'}, {name: 'three'}, {name: 'four'}];
this.activeViewObservable = new Observable<ViewModel>(observer => this.viewObserver = observer);
}
public setView(view:ViewModel):void {
this.viewObserver.next(view); // load values here
}
}
私はviewcomponent
と呼ばれるコンポーネントを使用する方法を参照してください:ここで
は私のトップレベルのアプリのコンポーネントのですか?ここのthats:
@Component({
selector: 'viewcomponent',
directives: [
ROUTER_DIRECTIVES
],
template: `
<div class="tab-pane" [ngClass]="{ 'active': isActive() }">
...
</div>
`
})
export class ViewComponent {
// these values are always the last view. why???
@Input() viewName:string;
@Input() activeViewObservable:Observable<TabViewModel>;
private activeView:ViewModel;
constructor() {}
ngOnInit() {
this.activeViewObservable.subscribe(//listen to values loaded with the viewObserver
activeView => {this.activeView = activeView;},
error => console.error(error));
}
public isActive():boolean {
let bool:boolean = false;
if (this.activeView) {
console.log(this.viewName); // <---- this value is always the last view, 'four'
bool = this.activeView.name == this.viewName;
}
console.log(bool);
return bool;
}
}
使用してデータモデルのイムはここにある:私はAppComponent
の値とオブザーバをロードし、子供にそれらに加入しようとしている
export interface ViewModel {
name: string;
}
。ただし、observableで生成される値は常に最後の要素です。私は間違って何をしていますか?私は、親のsetView
メソッドを呼び出して、その特定の子ビューにクラスを適用できるようにします。