我正在尝试隐藏登录组件中的侧导航栏。但它并没有隐藏。 我创建了侧面导航服务,
import { Injectable } from '@angular/core';
@Injectable()
export class SidenavService {
visible: boolean;
constructor() {this.visible = false; }
hide() { this.visible = false; }
show() { this.visible = true; }
toggle() { this.visible = !this.visible; }
}
在侧面导航html:
<nav class="main-menu" style="margin-top:50px; position: fixed; background-color:#163648;">
<ul>
<li>
<a routerLink="home">
<i class="fa fa-calendar fa-2x"></i>
<span class="nav-text">home</span>
</a>
</li>
<li class="has-subnav">
<a routerLink="user">
<i class="fa fa-user fa-2x"></i>
<span class="nav-text">Users</span>
</a>
</li>
</ul>
</nav>
在side.ts中:
isIn = false;
toggleState() {
let bool = this.isIn;
this.isIn = bool === false ? true : false;
}
@ViewChild('childModal') childModal: SidenavComponent;
constructor(private router: Router, private viewContainerRef: ViewContainerRef, public sidenav: SidenavService) {
}
答案 0 :(得分:0)
在side.ts
的父级中 - 你应该有一个控制sidenav可见性的布尔值。
isSideNavDisplay: boolean = true;
然后,您可以将您的服务注入此构造函数。
constructor(public sidenav: SidenavService){}
然后从这里你有几种方法 - Observables , onChanges ,公共静态 不建议
我将解释一种方法(和我的首选)
您应该重新设计服务以包含BehaviourSubject<boolean>
,它将向所有订阅者发布可见性状态。
import { Injectable } from '@angular/core';
import { BehaviourSubject } from 'rxjs';
@Injectable()
export class SidenavService {
$visible: BehaviourSubject<boolean>;
visible: boolean;
constructor() {
this.visible = false;
$visible = new BehaviourSubject(false);
}
getVisibilityStream(){
return this.$visible;
}
hide() {
this.visible = false;
this.$visible.next(this.visible);
}
show() {
this.visible = true;
this.$visible.next(this.visible);
}
toggle() {
this.visible = !this.visible;
this.$visible.next(this.visible);
}
}
在您的父组件(side.ts的父级)中,您需要在注入后立即订阅此服务。
constructor(public sidenav: SidenavService){
sidenav.getVisibilityStream().subscribe(visible => isSideNavDisplay = visible);
}
在您的父模板中:
<sidenav *ngIf="isSideNavDisplay"></sidenav>
只需注入服务并调用任何公开曝光的方法toggle()
hide()
或show()
答案 1 :(得分:-1)
我会适当地解决它,因为隐藏dom元素可以通过两种方式完成:
<div [hidden]="!visible">This is the side menu</div>
或者更好的方法,因为你不需要加载你显然不需要的东西。
<div *ngIf="!visible">This is another way of hiding</div>
可以使用非常简单的服务在两种状态之间切换:`
import { Input} from '@angular/core';
export class SidenavService {
@Input() visible: boolean;
}
*如果您希望其他服务与之互动,您还需要添加Injectable。
然后从您的父组件中,您可以简单地设置布尔值的值:`
import {SidenavService} from '??';
...
constructor(private showMenu: SidenavService) { }
show() { this.showMenu.visible = true; }
toggle() { this.showMenu.visible = !this.showMenu.visible; }}