活字体を指しボタン(サイドバーを折りたたんだり展開したりします)。
代わりに、共通の親オブジェクト(Window)によって保持されているサービスインスタンスを挿入することによって、これらを結合しました。このサービスは、コンポーネントが購読することができ、観察sidebarToggled$
を公開
import { Injectable } from 'angular2/core';
import { Subject } from 'rxjs/Subject';
@Injectable()
export class SidebarService {
private sidebarToggledSource = new Subject();
sidebarToggled$ = this.sidebarToggledSource.asObservable();
toggleSidebar(collapsed: boolean) {
this.sidebarToggledSource.next({});
}
}
:ここ
は方法です。
import { Component } from 'angular2/core';
import { NavigationBar } from './navigation-bar.component';
import { Sidebar } from './sidebar.component';
import { SidebarService } from './sidebar.service';
@Component({
selector: 'x-window',
directives: [NavigationBar, Sidebar],
template: `
<x-navigation-bar></x-navigation-bar>
<div>
<x-sidebar></x-sidebar>
<div class="content"></div>
</div>
`,
providers: [SidebarService]
})
export class Window {
constructor (private sidebarService: SidebarService) { }
}
同じインスタンスは、子コンポーネントに注入される(他のproviders
配列またはそれらを追加しないでくださいあなたがしている新しいインスタンスを取得します:SidebarService
の新鮮なインスタンスは、Window
コンポーネントに注入されます親コンポーネントの1から切断):!だから、
import { Component } from 'angular2/core';
import { SidebarService } from './sidebar.service';
@Component({
selector: 'x-hamburger-button',
template: `
<div (click)="toggleSidebar()">
<i class="fa fa-bars">
<a href="#"></a>
</i>
</div>
`
})
export class HamburgerButton {
constructor (private sidebarService: SidebarService) { }
toggleSidebar() {
this.sidebarService.toggleSidebar(true);
};
}
と
import { Component } from 'angular2/core';
import { SidebarService } from './sidebar.service';
@Component({
selector: "x-sidebar",
template: `
<div [ngClass]="{collapsed: collapsed}">
<ul>
<li>Menu Item 1</li>
<li>Menu Item 2</li>
<li>Menu Item 3</li>
<li>Menu Item 4</li>
<li>Menu Item 5</li>
</ul>
</div>
`,
styles: [
...
]
})
export class Sidebar {
collapsed: boolean = false;
constructor (private sidebarService: SidebarService) {
sidebarService.sidebarToggled$.subscribe(data => {
this.collapsed = !this.collapsed;
console.log('event caught');
});
}
}
、場合をクリックすると、のSidebarService
が呼び出されます。その同じサービスの観察可能なsidebarToggled$
からsubscribe
dはSidebar
のすなわちcollapsed
プロパティがトグルされ、その機能を呼び出す必要があります持っている子コンポーネントに注入します(Window
で作成)ServiceSidebar
の一つだけなので、Sidebar
は、あります。 styles
セクションのngClass
とSidebar
の部分を折りたたんだり展開したりすると、このプロパティを使用できるようになりました。
私はチャイルドコンポーネント(上記のハンバーガーボタンはサイドバーの内側にあります)からカスタムイベントをキャッチすることができますか? –
私のコードをチェックしましたか?ハンバーガーとサイドバーの関係は何ですか?何かありますか?ハンバーガーボタンをサイドバーにインポートしますが、なぜですか?このすべての質問に答えるには、自分のコードを注意深く見てください。 – micronyks
ええ、私はあなたのソリューションを試しましたが、少なくとも私のためには機能しませんでした。私はハンバーガーボタンを輸入しました。なぜなら、必要とされた別の記事を読んでいたからです(イベントは知られていませんでした)。私のトラックで私を止めさせたのは、別のハンバーガーボタンをサイドバーの内側に置いたことです(サイドバーを崩してボタンが消えたという明白な理由はありません)。とにかく、私はサイドバーとハンバーガーボタンの間のサービスを仲介して別の方法でこれを設定しようとしています。 –