【问题标题】:*ngFor hide on click*ngFor 点击隐藏
【发布时间】:2018-04-30 14:49:18
【问题描述】:

我在尝试隐藏一些 div 时遇到问题。

代码:

example.component.html

<div class="allCompanies"  [@listAnimation]="companies.lenght">
  <div id="{{i}}" class="company" *ngFor="let comp of companies; let i = index">
    <div *ngIf="show" class="card" id="card">
      <div class="row">
        <div class="col-sm-8">
          <p>
            <strong>Name: </strong>{{comp.name}}</p>
          <p>
            <strong>Data: </strong>{{comp.data}}</p>
        </div>
        <div class="btnDiv col-sm-4">
          <button class="btn login" (click)="showLogin($event, i)">Login</button>
        </div>
      </div>
    </div>
  </div>
</div>

当我单击一个按钮时,如何使单击的元素在页面上保持可见而使其他元素消失?

谢谢大家!

【问题讨论】:

  • 你可以这样做:(1)​​在代码中定义selectedComp(使用适当的类型),(2)当你点击一个项目时,做(click)="selectedComp = comp",(3)过滤*ngIf="!selectedComp || selectedComp === comp".
  • @ConnorsFan 几乎哈哈,这种行为确实使消失的元素是单击的元素并显示其他元素,我想要确切的对面,保留单击的元素并隐藏其他元素。有什么想法吗?
  • 我不知道你怎么能得到这个结果。 *ngIf 中的表达式应仅针对所选组件计算为 true,或者如果 selectedComp 未定义。

标签: angular hide ngfor


【解决方案1】:

有很多方法可以做到这一点。这是众多之一。您可以在单击按钮时实现对 empresas 数组的过滤。 执行以下操作:在 showLogin($event, i) 函数中,您可以删除元素 没有被点击的empresas数组

<button class="btn login" (click)="showLogin($event, i)">Entrar</button>

在您的 .ts 文件中:

showLogin($event, index) {
    for (let k = 0; k < this.empressas.length; k++) {
        if (k != index) {
            this.empressas.slice(k,1);
        }
    }
}

这样,现在在您的 epressas 数组中,您将只有一个元素,即您单击的元素,并且它只会呈现一个元素。就像我提到的,这可能是解决这个问题的许多方法之一。希望对您有所帮助!

【讨论】:

  • 完全同意,但是如果我使用切片,我会遇到一个问题,如果我后悔选择了那个选项,并且我退后一步,我的数组已经丢失了所有其他元素,不是吗?跨度>
  • 是的,没错。必须有一种方法可以将该起始数组保存在某个辅助变量中,因此当您过滤 empressas 数组时,您不会丢失初始数据......然后当您后悔选择该选项时,当您返回时,您会重新实例化 empressas 变量,例如this.empressas = this.helperVariableEmpressas
  • 你怎么回去?是否有可以单击的按钮使您进入先前状态(开始状态)?如果是这种情况,您只需要将 click 事件侦听器放在该按钮上,并使用方法 on it 。在该方法中,您可以刷新 empressas 变量并从头开始: this.empressas = this.helperVariableEmpressas
  • 我实际上并没有这样做,但也许我会进一步开发它哈哈哈。非常感谢。
  • 没问题! :)
【解决方案2】:

我认为你应该这样做,从 showLogin 函数中删除 i 参数:

<div class="allCompanies"  [@listAnimation]="empresas.lenght">
  <div id="{{i}}" class="empresa" *ngFor="let comp of empresas; let i = index">
    <div *ngIf="show" class="card" id="card">
      <div class="row">
        <div class="col-sm-8">
          <p>
            <strong>Name: </strong>{{comp.name}}</p>
          <p>
            <strong>Data: </strong>{{comp.data}}</p>
        </div>
        <div class="btnDiv col-sm-4">
          <button class="btn login" (click)="showLogin($event)">Entrar</button>
        </div>
      </div>
    </div>
  </div>
</div>

在你的控制器中,将类设置为元素,将所有 .card 设置为 card-hide,将点击元素的父级设置为 card-show:

showLogin = function (event) {

    var target = event.target;
    var pElement = target.parentElement.parentElement;
    var pclassAttr = pElement.attributes.class;
    var cardElems = angular.element( document.querySelector('.card'));
    cardElems.addClass('card-hide');
    pElement.classList.remove('card-hide');
    pElement.classList.add('card-show');
}

因此,在您的 CSS 文件中,您应该分别隐藏和显示这些选择器。我希望它有效。

有关添加和删除方法的更多信息,请查看link

【讨论】:

  • 抱歉,我使用的是 angular 4 :S。无论如何,谢谢您花时间回答。
  • 哦,对不起。那么你可以使用Renderer2 类。它是操作 DOM 元素的助手。一旦在构造函数构造函数中导入并赋值(private renderer: Renderer2) { } 你可以像这样使用它:this.renderer.setStyle(this.el.nativeElement, 'color', 'blue');
【解决方案3】:

我已经对下面的解决方案进行了 sudo 编码,基本上您需要使用服务或将您迭代的子项包装在另一个组件中。然后,您需要使用 ngClass 或 ngStyle 来隐藏隐藏属性设置为 false bar 的项目,即您单击的项目。

看看这个:

 export class ListHandlerService {
    public myList: any[];

    constructor() {
        this.myList = [
            {
                name: 'bob',
                hidden: false
            },
            {
                name: 'john',
                hidden: false
            }
        ]//whatever your list is
    }

    hideOthers(name: any) {
        let newList = this.myList.map((object) => {
            if (object.name !== name) {
                return object.hidden = true
            }
        })
        this.myList = newList;
    }
}


export class ItemComponent {
    public name: string;
    public hidden: boolean = false;
    constructor(private myListHandler: ListHandlerService) { }

    onClick() {
        this.myListHandler.hideOthers(this.name)
    }
}

【讨论】:

    【解决方案4】:

    这里有一个更简单的解决方案。

     <div *ngIf="show[i]" class="card" id="card"> //Change show to show[i]
    

    在你的 ts 文件中添加:

    show = [];
    
    showLogin(event: any, index: any){
       this.show[index] = !this.show[index];
    }
    

    【讨论】:

    • OP 要求单击的元素“在页面上保持可见并使其他元素消失?”。您的解决方案会切换每个单独的元素。
    • @DimitriosK。你说的对。我错过了这个问题。
    猜你喜欢
    • 1970-01-01
    • 2017-02-28
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-30
    相关资源
    最近更新 更多