【问题标题】:How do I tell which component is currently active Angular 5如何判断哪个组件当前处于活动状态Angular 5
【发布时间】:2018-05-01 16:00:44
【问题描述】:

我正在尝试制作一个设置按钮,该按钮可以根据用户当前正在查看的组件动态更改其内容。我不确定这样做的标准做法是什么。我认为正确的方法是使用某种类型的内置角度指令,告诉我当前正在使用哪个路由器链接,然后在设置组件模板中使用它来使用 *ngIf 更改 DOM。我可以阅读 URL 并这样做,但它似乎不正确。我想我可以在每个组件中放置一个“isAlive”标志,但对于大多数网站来说,这似乎是一项非常标准的工作,所以我猜这也不是正确的解决方案。有代码示例的建议吗?

这里是一个示例父组件模板(app组件)

<nav ="navbar navbar-toggleable-md navbar-inverse bg-primary fixednav">
            <li class="nav-item">
                <a class="nav-link" routerLink="/checklist" routerLinkActive="active">
                   Checklist
                </a>
            </li>
            <li class="nav-item">
                <a class="nav-link" routerLink="/otherComponent" routerLinkActive="active">
                   OtherComponent
                </a>
            </li>
</nav>

这是我说的设置模板。

    <div *ngIf="someRouterThing.checklistComponent.Active" class="settings">
      <div class="panel-body navbar navbar-inverse bg-primary">
          <!-- Rounded switches -->
        <div>
          <label class="switch">
              <input type="checkbox" [checked]="checklistSettings.hideCheckedEnabled" (change)="toggleHideChecked()">
              <span class="slider round"></span>
          </label> Hide Checked
        </div>
        <div>
            <label class="switch">
                <input type="checkbox" [checked]="checklistSettings.hideHiddenEnabled" (change)="toggleHideHidden()">
                <span class="slider round"></span>
            </label> Hide Hidden
        </div>
      </div>
    </div>

    <div *ngIf="someRouterThing.otherComponent.Active class="settings">
       todo- add settings stuff that is different from above
    </div>

【问题讨论】:

  • 我建议使用路由器插座。有关路由,请参阅Angular documentation
  • @ConnorsFan 我确实在 appcomponent 中使用了路由器插座。但这是我可以用来告诉“使用哪个组件代替 ”的东西。这就是我需要知道的,以便我可以根据用户所在的组件更改设置菜单
  • 可以通过处理路由器出口的activate事件来知道加载了哪个组件,如this answer所示。不知道这是否是你想要的......
  • @ConnorsFan 大概就是这样。你想写一个答案让我接受吗?我明天试试看。
  • 你有机会尝试一下吗?

标签: javascript html angular


【解决方案1】:

路由器出口有一个activate 事件,加载的组件作为$event 参数。可以通过它知道当前加载了哪个组件,如this stackblitz所示。

在模板中:

<router-outlet (activate)="onActivate($event)"></router-outlet>

在组件代码中:

export class AppComponent {

  routerOutletComponent: object;
  routerOutletComponentClassName: string;

  onActivate(event: any): void {
    this.routerOutletComponent = event;
    this.routerOutletComponentClassName= event.constructor.name;
  }
}

【讨论】:

    【解决方案2】:

    您可以分配一个布尔变量并在组件的构造函数中将其更改为 true。然后在视图部分 (app.component.html) 中调用该布尔值。

    每当用户访问/查看该页面时,在构造函数中分配的值将传递给查看页面 (app.component.html)。您可以在 *ngIf 中分配该值。

    【讨论】:

    • 但是每当用户离开时,该值需要设置为false。我可以把它放在 ngOnDestroy() 中,但它总是保证运行吗?我讨厌因为生命周期事件未运行而错误设置标志。
    【解决方案3】:

    您可以创建一个服务来跟踪要显示的选项。

    服务可能如下所示:

    @Injectable()
    export class OptionsVisibilityService {
        checklistOptionsVisible = new BehaviorSubject<boolean>(false);        
        otherOptionsVisible = new BehaviorSubject<boolean>(false);
    }
    

    在您的组件中,您可以更新 OnInit 和 OnDestroy 生命周期事件中的状态:

    @Component({/** ... */})
    export class ChecklistComponent implements OnInit, OnDestroy {
        constructor(private optionsVisibility: OptionsVisibilityService) {
        }
    
        ngOnInit() {
            this.optionsVisibility.checklistOptionsVisible.next(true);
        }
        ngOnDestroy() {
            this.optionsVisibility.checklistOptionsVisible.next(false);
        }
    }
    

    在显示选项的组件中提供可见性服务:

    export class OptionsButtonComponent {
    
        checklist$: Observable<boolean>;
        other$: Observable<boolean>;
        constructor(optionsVisibility: OptionsVisibilityService) {
            this.checklist$ = optionsVisibility.checklistOptionsVisible.asObservable();
            this.other$ = optionsVisibility.otherOptionsVisible.asObservable();
        }
    }
    

    然后在模板中使用:

    <div *ngIf="checklist$ | async">
        <!-- Show checklist options -->
    
    </div>
    <div *ngIf="other$ | async">
        <!-- Show other options -->
    </div>
    

    【讨论】:

    • 这看起来可行。我唯一的问题是:是否保证在组件不使用时调用 ngOnDestry()?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-30
    • 1970-01-01
    • 2011-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多