次の問題があります。
サイドバーには私のメニューがあり、ボタン kag をクリックすると、コンポーネント ヘッダーの 3 つの新しいボタンが読み込まれます (写真を参照)。
どのように実装できるかわかりません:( ヒントや例を教えてもらえますか?これはイベントバインディングで行われていることはわかっていますが、別のコンポーネントでクリックしてコンテンツを使用する方法はまだわかりません..
よろしくアンドレアス
次の問題があります。
サイドバーには私のメニューがあり、ボタン kag をクリックすると、コンポーネント ヘッダーの 3 つの新しいボタンが読み込まれます (写真を参照)。
どのように実装できるかわかりません:( ヒントや例を教えてもらえますか?これはイベントバインディングで行われていることはわかっていますが、別のコンポーネントでクリックしてコンテンツを使用する方法はまだわかりません..
よろしくアンドレアス
問題を解決するために利用できるオプションがいくつかあります。ここで提供するソリューションでは、右メニューとヘッド メニューの両方がルート コンポーネントに配置されていると想定しています。
私がすることは、ルートにリンクされるリゾルバーを使用することです。このリゾルバはメニューを更新します。これは、メニューが ngrx を使用してサービスまたはアプリの状態に保存されていることを意味します。ngrx のことはしばらく忘れて、単純な angular サービスを使用していると仮定します。
メニュー項目の設定をサービス内に保存することで、そのコントロールを他のコンポーネントから完全に切り離しました。これにより、動作の単体テストが容易になります。また、すでに実装されている動作を変更せずにメニューを別の方法で構成できるため、柔軟性も提供します。
推奨される実装を次に示します。私はそれをテストしていませんが、開始パスを提供する可能性があります。
サービスはこちら
export type MenuItems = MenuItem[];
export interface MenuItem {
label: string;
}
@Injectable()
export class MenuItemsService {
private $menuItems = new BehaviorSubject([]);
set menuItems(menuItems: MenuItems){
this.$menuItems.next(menuItems);
}
get menuItemsChanges() {
return this.$menuItems;
}
}
ここにリゾルバーがあります。実行するために、ルートにリンクすることを忘れないでください。もちろん、リゾルバー以外の場所から実行したい場合はMenuItemsService
、同じ方法で呼び出すことができます。
@Injectable()
export class KAGDetailsResolve implements Resolve<MenuItems[]> {
menuItems: MenuItems = [
{
label: 'My first button'
},
{
label: 'My second button'
},
];
constructor(private menuItemService: MenuItemsService) {}
resolve(route: ActivatedRouteSnapshot) {
this.menuItemService.menuItems = this.menuItems;
return this.menuItems; // we return it as it is mandatory but that's actually not used in this example
}
}
そして、動的メニューの表示を担当するコンポーネントは次のとおりです。
// the component which will render your menu
@Component({
selector: 'my-dynamic-menu',
template: `<ul>
<li *ngFor="menuItem in menuItems | async"> {{ menuItem.label }}</li>
</ul>`
})
export class MyDynamicMenuComponent implements OnInit{
$menuItems: Observable<MenuItems>;
constructor(private menuItemService: MenuItemsService) {}
ngOnInit(): void {
this.$menuItems = this.menuItemService.menuItemsChanges;
}
}
ご覧のとおり、依存していObservable
ます。さらに、MenuItem
クラスは非常に貧弱ですが、アイテムのより多くのプロパティを記述することができます (色、CSS クラス、クリック時にトリガーする関数、任意の URL など)。
ショートカット コンポーネントを作成できます。それはどのように機能しますか?
// in both component
constructor(private mainService: MainService) {}
// on click on your li or a
mainService.shortcut.next(['menu1'));
// in your menu component, onInit :
this.mainService.shortcut.subscribe((shortcut) => {
if(shortcut) { this.shortcutList.push(shortcut); }
};