Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/432.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何判断哪个组件当前处于活动状态_Javascript_Html_Angular - Fatal编程技术网

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

Javascript 如何判断哪个组件当前处于活动状态,javascript,html,angular,Javascript,Html,Angular,我试图创建一个设置按钮,根据用户当前查看的组件动态更改其内容。我不确定这样做的标准做法是什么。我认为正确的方法是使用某种类型的内置角度指令,告诉我当前正在使用哪个路由器链接,然后在设置组件模板中使用该指令,使用*ngIf更改DOM。我可以读取URL并这样做,但它似乎不正确。我想我可以在每个组件中添加一个“isAlive”标志,但对于大多数网站来说,这似乎是一个非常标准的工作,所以我猜这也不是正确的解决方案。有没有关于代码示例的建议 下面是一个示例父组件模板(应用程序组件) 清单 其他组件

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

下面是一个示例父组件模板(应用程序组件)


  • 清单
  • 其他组件
  • 这是我要说的设置模板

        <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>
    
    
    隐藏检查
    隐藏
    
    您可以在组件的构造函数中分配一个布尔变量并将其更改为true。然后在视图部分(app.component.html)中调用该布尔值


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

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

    该服务可能看起来像这样:

    @Injectable()
    export class OptionsVisibilityService {
        checklistOptionsVisible = new BehaviorSubject<boolean>(false);        
        otherOptionsVisible = new BehaviorSubject<boolean>(false);
    }
    
    使可见性服务在显示选项的组件中可用:

    export class OptionsButtonComponent {
    
        checklist$: Observable<boolean>;
        other$: Observable<boolean>;
        constructor(optionsVisibility: OptionsVisibilityService) {
            this.checklist$ = optionsVisibility.checklistOptionsVisible.asObservable();
            this.other$ = optionsVisibility.otherOptionsVisible.asObservable();
        }
    }
    
    导出类选项按钮组件{
    检查表$:可观察;
    其他$:可见;
    构造函数(选项可见性:选项可见性服务){
    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>
    
    <router-outlet (activate)="onActivate($event)"></router-outlet>
    

    路由器出口有一个
    激活
    事件,加载的组件作为
    $event
    参数。您可以使用它来了解当前加载的组件,如中所示

    在模板中:

    <div *ngIf="checklist$ | async">
        <!-- Show checklist options -->
    
    </div>
    <div *ngIf="other$ | async">
        <!-- Show other options -->
    </div>
    
    <router-outlet (activate)="onActivate($event)"></router-outlet>
    

    但每当用户离开时,该值都需要设置为false。我可以把它放在ngondstroy()中,但它总是保证运行吗?我讨厌标志设置不正确,因为生命周期事件没有运行。我建议使用路由器出口。请参阅关于路由。@ConnorsFan我确实在appcomponent中使用了路由器出口。但这是我可以用来告诉“使用哪个组件来代替”的东西吗。这就是我需要知道的,这样我就可以根据用户所在的组件更改设置菜单,您可以处理路由器出口的
    activate
    事件,以了解加载了哪个组件,如所示。不确定这是否是你想要的…@ConnorsFan可能就是这样。你想写个答案让我接受吗?我明天就试试。你有机会试试吗?看起来会有用的。我唯一的问题是:是否保证在组件未使用时调用ngondery()?
    export class AppComponent {
    
      routerOutletComponent: object;
      routerOutletComponentClassName: string;
    
      onActivate(event: any): void {
        this.routerOutletComponent = event;
        this.routerOutletComponentClassName= event.constructor.name;
      }
    }