如何在 Angular2 中操作特定路径上的组件

2023-11-24

我有一个简单的TopbarComponent这基本上在我的视图顶部添加了一个引导式导航栏。

由于我的 90% 的模板应该包含这个指令,我想通过我的app.component看起来像这样:

import ...;

@Component({
    selector: 'my-app',
    templateUrl: 'app/app.component.html',
    directives: [ROUTER_DIRECTIVES, TopbarComponent, ...],
    providers: [ROUTER_PROVIDERS, ...]
})

@RouteConfig([
{
    path: '/login',
    name: 'Login',
    component: LoginComponent
},
{
    path: '/dashboard',
    name: 'Dashboard',
    component: DashboardComponent,
    useAsDefault: true
}
])

它的模板如下所示:

<my-topbar></my-topbar>

<div class="container-fluid">
    <div class="row">
        <router-outlet></router-outlet>
    </div>
</div>

现在我想用ngIf(或者除了用CSS隐藏它之外的任何其他方式)隐藏多个路线上的顶栏,例如/login例如。 我尝试了几种方法使用@CanAcitvate()或实施OnActivate in my LoginComponent(以及从我的尝试AppComponent)但没有任何效果(甚至无法启动功能)。 我得到的最接近的是使用Router直接在我的AppComponent像这样:

export class AppComponent implements OnInit{
    showTopbar:boolean;

    constructor(private _router:Router) {}

    ngOnInit():any {
        this.showTopbar = this._router.lastNavigationAttempt != '/login';
    }
}

并在我的app.component.html我将指令更改为<my-topbar *ngIf="showTopbar"></my-topbar>

但这仅适用于我的应用程序的初始加载,因为ngOnInit不会在每次状态更改时触发。我是否可以使用类似的方法(只是找不到)或者我在这里朝错误的方向前进?


Edit:

目前,PierreDuc 的答案对我不起作用,但我尝试使用类似的方法location.path()像这样:

constructor(private _location:Location) {}

private get _hideTopbar() : boolean {
    switch(this._location.path()){
        case '/register':
        case '/login':
            return true;
        default:
            return false;
    }
};

可惜我不能使用data财产在@RouteConfig在这种方法中。感觉会好一些。


一段时间以来,我一直在为类似的问题而苦恼。 我找到的解决方案一开始可能会被认为很棘手,但将来可以为我解决许多类似的此类问题。

基本上,你必须做router-outlet在路线改变时发出一个事件,让你的AppComponent监听该自定义事件。

第一步是创建一个自定义路由器出口:

@Directive({
selector: 'custom-router-outlet'
})
export class CustomRouterOutlet extends RouterOutlet {
    private parentRouter:Router;

    constructor(_elementRef: ElementRef,
            _loader: DynamicComponentLoader,
            _parentRouter: Router,
            @Attribute('name') nameAttr: string) {
    super(_elementRef, _loader, _parentRouter, nameAttr);
    this.parentRouter = _parentRouter;
    }

    activate(nextInstruction: ComponentInstruction): Promise<any> {
        //***YOUR CUSTOM LOGIC HERE***
        return super.activate(nextInstruction);
    }
}

这是自定义路由器出口的非常基本的实现。你的逻辑必须在activate方法,在每次路线更改时调用。 在此方法中,您可以检查路线中的数据属性。

现在主要的问题是,指令无法发出事件...它们只接受输入,不能触发输出...

我找到了解决此问题的方法:创建一个Service用于组件和指令之间的通信使用EventEmitter:

@Injectable()
export class PubsubService {
    private _pubSubber: EventEmitter<any> = new EventEmitter();

    routeisChanging(obj:any) {
        this._pubSubber.emit(obj);
    }

    onRouteChanged() {
        return this._pubSubber;
    }
}

The 应用组件订阅了onRouteChanged event:

subscription:any;
constructor(private _pubsubService:PubsubService) {
    this.subscription = this._pubsubService.onRouteChanged().subscribe(data => {
        /**YOUR CUSTOM LOGIC HERE*/});
}

The 自定义路由器插座触发事件activate需要时的方法:

activate(nextInstruction: ComponentInstruction): Promise<any> {
    //***YOUR CUSTOM LOGIC HERE***
    this._pubsubService.routeisChanging(nextInstruction.routeData.data['hideTopbar']);
    return super.activate(nextInstruction);
}

这样就可以轻松实现路由器与路由器之间的通信了AppComponent,与任何逻辑。

你必须记住将通信服务注入RootComponent您的应用程序的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 Angular2 中操作特定路径上的组件 的相关文章

  • 为什么 Angular 4.3 中的 httpclient 返回 Object 而不是 any?

    Angular 4 3 中的新 HttpClient 类似乎又回来了Object代替any默认情况下 鉴于打字稿文档所述 这样做是否有特殊原因 永远不要使用数字 字符串 布尔值或对象类型 这些 类型指的是几乎从未使用过的非原始装箱对象 适当
  • viewChild如何获取Angular2中添加了js的元素?

    如果一个 HTML 元素已添加到 DOM 中 例如单击按钮后 我们如何访问该元素 viewChild 看不到它 更新1 更多说明 我用过 jquery 数据表 jquery dataTablesdefineTyped 版本 https gi
  • 如何连接我的 angular2 应用程序 javascript 文件

    对于我的 Angular2 TypeScript 应用程序 我将所有 js 文件合并到一个 app min js 文件中 然后 System import 将此文件导入到我的 index html 页面 然后我得到一个同一模块文件中的多个匿
  • 在角度项目中使用茉莉花进行单元测试订阅方法

    我正在尝试测试ngOnInit 具有的组件的方法subscribe method 成分 import Component OnInit from angular core import SharedDataService from serv
  • Chartjs + Angular6 未显示图表或任何错误

    我正在尝试以角度实现chart js 编写了一个简单的代码来在html上显示图表 但是页面上没有输出 也没有错误 我不明白问题出在哪里以及为什么显示图表失败 堆栈闪电战 https stackblitz com edit angularch
  • 带有 angular-cli 的 SVG 图标系统

    我有一个 Angular2 项目 它是通过 Angular CLI 创建的 在 webpack 中 有一个加载器来加载 svg sprite 并从 svgs 列表生成该 sprite 但是 当 angular cli 不允许我更改 webp
  • Angular 2 中的 Observable 和 ngFor

    下面是一个使用 rxjs Observables 的简单示例 Angular 2 组件 import Component OnInit from angular core import Observable from rxjs Observ
  • 当我没有执行任何数据更改时,为什么会收到 NG0901 错误?

    在下面的代码段中 我正在迭代 ardene section1 items 我已将此数组记录到控制台以验证它确实存在 BEFORE FOR LOOP 测试会打印到屏幕上 但 INSIDE FOR LOOP 测试不会打印 我得到了 NG0901
  • 如何在 Typescript 中使用正则表达式进行电子邮件验证[重复]

    这个问题在这里已经有答案了 我需要使用 typescript Angular 应用程序验证 Excel 文件中的电子邮件和日期字段 我尝试使用正则表达式进行验证 但对于正确的电子邮件地址 结果始终返回 false 谁能帮我验证电子邮件和日期
  • 如何在 Angular 2 Material Autocomplete 中获取所选项目的值

    我使用 Angular Material 创建了一个自动完成字段 并成功从 Web api 获取国家 地区列表 CountryID gt 项目值 或索引 国家 地区 gt 项目文本 当我尝试获取所选项目的值 而不是文本 时 它会按预期返回文
  • Mat-table 多行内的多行

    我想要的内容如下图所示 我使用 Angular Material 7 x 并使用 Mat Table 实现 如下所述 https material angular io components table overview https mat
  • 将 Angular v12 升级到 v13 时出现“模块未找到”错误

    嗨 开发者和贡献者 我正在努力找出以下错误的问题所在 src app models type ModelType ts 2 0 44 错误 找不到模块 错误 导出字段无法解析目录 请求为 当我将 Angular 版本从 v12 升级到 v1
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • ionic 2 google 图表未捕获类型错误:(void 0) 不是函数

    error 我想添加谷歌图表并按照这个https www npmjs com package angular2 google chart https www npmjs com package angular2 google chart 但
  • Angular Material Table:自定义排序文件夹和文件项

    我的里面有不同类型的物品mat table 文件和文件夹 它们必须像在 Microsoft 文件资源管理器中一样进行排序 文件夹不能与文件夹分开 同样也不能与文件分开 所有其他排序规则保持不变 有谁知道如何解决这个问题 先感谢您 您必须覆盖
  • 类型错误:无法读取未定义的属性“post”

    嗨 我只想使用一个简单的功能 http post 将我的日期发布到页面 我希望服务器能够获取我发布的日期 import Component OnInit from angular core import MarginServcies fro
  • AOT 编译器 - 包括延迟加载的外部模块

    我试图将外部模块 托管在 git npm 存储库中 作为延迟加载模块包含在我的 Angular 应用程序中 我正在使用 ngc 编译器编译我的外部模块 node modules bin ngc p tsconfig aot json 这是我
  • Angular 2:ngModel 输入上“数字”管道的光标问题

    我有一个输入 我想像货币一样显示 我希望只允许两位小数 并且只允许数字 同时在必要时自动添加逗号 基本上 如果用户输入 12345 我希望输入自动显示为 12 345 00 12 345 也可以接受 但如果他们输入 12345 5 则需要显
  • 如何以角度从守卫重定向到子路线

    如何从父路由的守卫重定向到子路由 同时保护子路由不被直接访问 绝对导航的问题当导航到子路由时 父组件上的守卫会在循环中再次调用 相对导航问题是警卫正在保护父路线 因此还没有激活的路线可供导航 此外 这可能不会保护子路由 也许同一个守卫也可以
  • 如何在Electron App中调用C# dll方法?

    我有一个电子应用程序 可以从读卡器读取信用卡详细信息 他们提供了一个 c dll 来与应用程序交互 我不知道如何从电子应用程序读取 dll 方法 首先使用以下命令检查 dll 中公开的函数依赖步行者 http www dependencyw

随机推荐