如何判断哪个组件当前处于活动状态Angular 5

时间:2018-05-01 16:00:44

标签: javascript html angular

我尝试制作一个设置按钮,根据用户当前正在查看的组件动态更改其内容。我不确定这样做的标准做法是什么。我认为正确的方法是使用某种类型的内置角度指令来告诉我当前正在使用哪个路由器链接,然后在设置组件模板中使用它来使用* 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>

3 个答案:

答案 0 :(得分: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;
  }
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

服务看起来像这样:

@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>