【问题标题】:Angular 2 - style component on another components button clickAngular 2 - 另一个组件按钮上的样式组件单击
【发布时间】:2018-05-01 23:09:14
【问题描述】:

我在一个触发功能的组件上有按钮:

<button class="btn-main" (click)="hideElement()"></button>

在另一个弹出的组件中(并且没有父子连接),我有 3 个这样的 div

 <div class="element1"></div>

当我单击父级中的按钮时,我希望隐藏一个(设置具有可见性的类:隐藏)。当我使用该按钮打开弹出窗口时如何隐藏该 div?

【问题讨论】:

    标签: angular styles


    【解决方案1】:

    在子模板中:

    <div class="element1" #element1 ></div>
    

    在子组件中:

    @ViewChild('element1') element1: ElementRef;
    

    在父母中:

    @ViewChild(ChildComponent) child: ChildComponent;
    
    constructor(private renderer: Renderer2) {}
    
    hideElement() {
      this.renderer.setStyle(child.element1 , 'visibility' , 'hidden');
    }
    

    【讨论】:

      【解决方案2】:

      方法一——亲子关系

      您可以使用hideDiv 属性隐藏或显示子组件中的div,并使用@Input 装饰器使该属性可用于数据绑定。该属性可以直接切换visibility 样式或将类应用于div:

      @Component({
        selector: 'child-component',
        template: `
          <div></div>
          <div [class.hiddenClass]="hideDiv"></div>
          <div [style.visibility]="hideDiv ? 'hidden' : 'visible'"></div>
          <div></div>
        `,
        styles: [`.hiddenClass { visibility: hidden; }`]
      })
      export class ChildComponent {
        @Input() hideDiv = false;
      }
      

      然后,您可以在单击父组件中的按钮时使用数据绑定对其进行修改:

      @Component({
        selector: 'parent-component',
        template: `
          <button (click)="hideChildDiv = !hideChildDiv">Toggle div visibility</button>
          <child-component [hideDiv]="hideChildDiv" ></child-component>
        `
      })
      export class ParentComponent {
        hideChildDiv = false;
      }
      

      您可以测试this stackblitz中的代码。


      方法 2 - 使用服务在两个组件之间进行通信

      您可以使用服务来允许两个独立的组件相互通信或共享某些信息。有关演示,请参阅 this stackblitz

      服务

      import { Injectable } from "@angular/core"
      
      @Injectable()
      export class VisibilityService {
        hideDiv = false;
      }
      

      父组件

      @Component({
        selector: 'app-root',
        template: `
          <child1></child1>
          <child2></child2>
        `
      })
      export class AppComponent {
      }
      

      Child1 组件

      import { VisibilityService } from "./visibility.service";
      
      @Component({
        selector: 'child1',
        template: `
          <button (click)="hideDiv = !hideDiv">Toggle div visibility</button>
        `
      })
      export class Child1Component {
      
        public get hideDiv(): boolean {
          return this.visibilityService.hideDiv;
        }
      
        public set hideDiv(value: boolean) {
          this.visibilityService.hideDiv = value;
        }
      
        constructor(private visibilityService: VisibilityService) { }
      }
      

      Child2 组件

      import { VisibilityService } from "./visibility.service";
      
      @Component({
        selector: 'child2',
        template: `
          <div class="div1"></div>
          <div class="div1" [class.hiddenClass]="hideDiv"></div>
          <div class="div1"></div>
          <div class="div1" [style.visibility]="hideDiv ? 'hidden' : 'visible'"></div>
          <div class="div1"></div>
        `
      })
      export class Child2Component {
      
        public get hideDiv(): boolean {
          return this.visibilityService.hideDiv;
        }
      
        constructor(private visibilityService: VisibilityService) { }
      }
      

      模块

      ...
      
      import { AppComponent } from './app.component';
      import { Child1Component } from './child1.component';
      import { Child2Component } from './child2.component';
      import { VisibilityService } from "./visibility.service";
      
      @NgModule({
        declarations: [ 
          AppComponent,
          Child1Component,
          Child2Component
        ],
        providers: [
          VisibilityService
        ],
        ...
      })
      export class AppModule { }
      

      【讨论】:

      • 我收到消息指出 Child1 类型上不存在属性 visibilityService ...我在 appmodule 中有服务,在组件中导入,但出现该错误...是否可以选择仅与一个组件一起使用按钮、服务和其他具有受影响 div 的组件?在这里,我有父母、服务和 2 个孩子? :) 提前感谢
      • 确保在每个组件类的构造函数中使用private visibilityService: VisibilityService 声明服务。不要忘记private
      • 是的,我有这个,私人的,我已经将该服务用于其他一些数据
      • 那我不知道你为什么会得到这个错误。您可以将您的代码与the stackblitz(没有错误)进行比较,看看它们的不同之处。
      • 与你的 stackblitz 的区别和我的代码是我没有包含 2 个子组件的父组件,我只有 2 个组件,第一个是按钮,第二个是 div,应该在按钮单击时隐藏。 .这会以某种方式改变事情吗?
      猜你喜欢
      • 2020-07-18
      • 2017-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2021-02-06
      • 2020-08-24
      • 2016-06-01
      相关资源
      最近更新 更多