angular - 我将如何在另一个组件中切换侧边栏?

标签 angular angular-material

我有一个带有 mat-toolbar 的标题组件,我有一个按钮,我想用它来切换另一个组件中的 sidenav 栏。如何在另一个组件中切换侧边栏?

我想在标题组件下方切换它。

https://stackblitz.com/edit/angular-adkpkv

我在这里复制了我的整个项目,但我似乎无法让它在 stackbitz 中运行。不过它确实在本地运行。

最佳答案

我建议你使用 services .优点是它们非常容易上手且易于使用。此外,每个组件甚至其他服务都可以访问服务,您可以根据需要从任意多个不同的组件切换侧边栏。 如果您熟悉例如C#,服务的行为类似于 C# 中的单例。

因此,您应该通过在 Angular CLI 中键入 ng g s toggle 来创建一个新服务。

import { Injectable } from '@angular/core';

@Injectable({
    providedIn: 'root'
})
export class ToggleService {

    constructor() { }
}

解决方案一:

这是没有漂亮动画的更简单的方法。切换侧边栏组件的最简单方法是将其放置在正确的位置,但设置 display: none。然后使用 ngClass 根据属性为侧边栏组件设置一个 css 类。将此代码应用到最顶部的侧边栏组件的标记中。

[ngClass]="{'show-sidebar': toggleService.showSidebar}"

为了让它工作,您必须在侧边栏的 css 中创建一个新的 css 类。添加:

.show-sidebar { 
    display: block;
}

之后,您向服务添加一个属性。

private _showSidebar = false;
public get showSidebar(): boolean{
    return this._showSidebar;
}
public set showSidebar(v : boolean) {
    this._showSidebar = v;
}

现在您将服务注入(inject)侧边栏组件并将其分配给一个属性,以便能够在您的 html 文件中引用该服务。因此,您可以使用 showSidebar 的 bool 值来切换 show-sidebar css 类。

接下来就是将服务注入(inject)到按钮所在的组件中,您可以使用它来切换侧边栏。之后,您将点击事件添加到您将 toggleService.showSidebar 的值更改为 true 的按钮。


解决方案 2:

现在如果你想使用例如Angular Animations您可以向服务添加一个属性,您可以从一个组件更改该属性,并且该更改将切换动画状态以使侧边栏动画化以移动到屏幕中。

private _sideBarState = 'inactive';
public get sideBarState(): string {
    return this._sideBarState;
}
public set sideBarState(v : string) {
    this._sideBarState = v;
}

接下来,您将 sliderState 绑定(bind)到 html 中的组件,因此在侧边栏组件的 html 中。只需将其添加到侧边栏最顶部的标签中即可。

[@sliderState]="toggleService.sideBarState"

要做到这一点,您必须先将 toggleService 注入(inject)到侧边栏组件中。如果您对此有疑问,请尽管问我。

之后,您必须在要设置动画的组件(侧边栏组件)的装饰器中添加不同的动画。

@Component({
selector: 'core-detail-page',
templateUrl: './detail-page.component.html',
styleUrls: ['./detail-page.component.scss'],
animations: [
    trigger('sliderState', [
        state('active', style({
            left: '0',
            display: 'block'
        })),
        state('inactive', style({
            left: '-300px',
            display: 'none'
        })),
        transition('inactive => active', animate('300ms ease-out')),
        transition('active => inactive', animate('300ms ease-out'))
    ])
]

})

这些只是一些虚拟值,我假装您的侧边栏组件设置为 position: absoulte 并放置在您的屏幕旁边,那些 -300px。一旦您将 toggleService 中的 sidebarState 的值更改为 active 属性 leftdisplay 将根据您对动画的定义进行动画处理。您可以为您想要的任何属性设置动画。

更改 sidebarState 是通过将 toggleService 注入(inject)到要用于切换侧边栏的按钮所在的组件中来完成的。注入(inject)服务后,向按钮添加点击方法,并在该方法中更改 sidebarState 的值。

toggleSidebar() {
    this.toggleService.sideBarState = 'active';
}

关于angular - 我将如何在另一个组件中切换侧边栏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55112956/

相关文章:

angular - 为什么我的单元测试在 Chrome 中通过而在 PhantomJS 中失败?

angular - 如何将 Promise 绑定(bind)到组件属性?

javascript - Electron 应用程序和基于 Web 的 Angular 应用程序

angular - 在调用 AppComponent.ts 之前 Angular 2 的起点是什么?

Angular:将常见的环境变量分离到 componEnt.ts 文件

CSS:将除最后一个元素之外的所有列表元素居中

angularjs - 如何从Angular Material的必填字段中删除星号

html - 如何设置$mdDialog 的最大宽度?

angular - 如何在使用标题模板的表格中使用 Angular Material MatSort?

Node.js 将数组转换为对象数组