【问题标题】:Angular 2 hide textarea which the user uncheckedAngular 2隐藏用户未选中的文本区域
【发布时间】:2017-03-01 05:29:15
【问题描述】:

textarea*ngFor 中呈现时,当我取消选中checkbox 时,如何隐藏textarea?所以复选框应该与文本区域绑定,对吧?它应该只隐藏用户未选中的textarea,而其他人应该保持可见。

我一直在尝试找出最简单的方法,尽管在我的实际代码中,如果勾选了框,则返回我true,如果没有,则返回false,但是它没有隐藏textarea全部。默认值为 true,因此它将所有文本区域显示为默认值。

由于某种原因,这个 plnkr 不允许我使用 [(ngMode)] 我认为它是一个不同的 RC 角度,但下面的示例基本上是我在取消选中它不隐藏文本区域的框时遇到的问题。

http://plnkr.co/edit/tOdtcmWxFB6vGuLyCqZS?p=preview

我的原始代码:

<label for="inputSearch.name" style="float: left;">
    <input  type="checkbox" id="{{inputSearch.name}}" [checked]="chkProp" (click)="chkboxCookie()" [(ngModel)]="inputSearch.value"> {{inputSearch.name}}
 </label>

<div class="" *ngFor="let inputSearch of searchBoxCount" class="col-sm-12">
    <textarea name="{{inputSearch.name}}" id="{{inputSearch.name}}" rows="3" class="search-area-txt" attr.placeholder="Search {{inputSearch.name}}"  [(ngModel)]="inputSearch.value" *ngIf="chkProp || chkProp==true || inputSearch.name"></textarea>
    <p> {{inputSearch.name}} - {{inputSearch.value}}</p>
</div>

【问题讨论】:

    标签: javascript html angular checkbox


    【解决方案1】:

    使用checkedUsers 的数组,并设置复选框以选中是否在数组中找到用户ISN'T。然后,如果在数组中找到user IS,则隐藏textarea

    然后,在复选框 change 上将 user 传递给更改,如果用户不在 checkedUsers 的数组中,则添加用户,如果他们已经在其中,则将其删除。

    PLUNKER

    这是您的组件的外观。但是有一些警告,每个用户上的name 必须是唯一的,或者向他们添加某种id 属性。另外,我在checkedUsers 数组上使用JSON.stringify 并将其放在localStorage 中,所以如果它变得很大会影响性能,但无论如何你应该使用数据库。

    import { Component, OnInit } from '@angular/core';
    
    @Component({
      selector: 'my-app',
        styles: [`
        .hidden {
          display: none;
        }
        `],
      template: `<p *ngFor="let user of users">{{ user.name }} - {{ user.age }} </p>
    
       <div *ngFor="let user of users">
          <textarea name="{{user.name}}" id="{{ user.name }}" [class.hidden]="checkedUsers.indexOf(user) >= 0"></textarea>
          <input type="checkbox" id="{{ user.name }}" [checked]="checkedUsers.indexOf(user) < 0" (click)="change(user)"/>
          <p>{{user.name}}</p>
       </div>
    
      `
    })
    export class AppComponent implements OnInit { 
      public users: string;
      public checkedUsers = [];
    
      constructor() {
    
      }
    
      ngOnInit() {
        this.users = [{name: 'User1', age: '21'}, {name:'User2', age:'31'}];
        this.checkedUsers = JSON.parse(localStorage.getItem("checkedUsers"));
    
        if(this.checkedUsers === null) {
          this.checkedUsers = [];
        } else {
          for(var i = 0; i < this.checkedUsers.length; i++) {
            var currCheckedUser = this.checkedUsers[i];
            for(var x = 0 ; x < this.users.length ; x++) {
              var currUser = this.users[x];
              if(currCheckedUser.name === currUser.name) {
                this.checkedUsers.splice(i, 1);
                this.checkedUsers.push(currUser);
              }
            }
          }
        }
      }
    
      change(user): void {
        var indexOfItem = this.checkedUsers.indexOf(user);
        if(indexOfItem >= 0) {
          this.checkedUsers.splice(indexOfItem, 1);
        } else {
          this.checkedUsers.push(user);
        }
        localStorage.setItem("checkedUsers",  JSON.stringify(this.checkedUsers));
      }
    
    }
    

    【讨论】:

    • 是的,但这恰恰相反。假设文本区域默认为true,所以一切都可见,那么如果我取消选中应该隐藏的User1,但User2 应该保持可见,如果两者都未选中,那么如果两者都选中,则两者都应该隐藏或可见。跨度>
    • @nCore 好的,检查帖子的编辑和更新的 plunker。我使用选中的users 数组,如果他们选中该框,我将user 推入数组,然后在textarea 上,如果在数组中找到user,则为hidden
    • 是的,就是这个!谢谢。如果你在附近,我会请你喝啤酒! .
    • 哈哈感谢您的提议,但投票和接受的答案很好!我很乐意帮忙!
    • 假设name 是唯一的,因为没有其他唯一标识符。我已更新 PLUNKERpost 以使用 localStorage 进行保存。抱歉拖了这么久,有点复杂
    【解决方案2】:
    <input type="checkbox" id="{{ user.name }}" [checked]="chkState" (change)="chkState = !chkState" />
    

    但是,您将遇到一个问题,它会隐藏您的所有文本区域。你需要使用一些独特的东西来保存它们各自的状态。

    【讨论】:

    • 这个想法只是隐藏您未选中的文本区域,我想这就是为什么我尝试使用 user.name 作为 ngModel 因为每个用户都有唯一的名称,但是 plnkr 不是允许我使用[(ngModel)]
    • 你能举个例子,我还能如何实现它?所以它只会隐藏用户未选中的文本区域。
    【解决方案3】:

    试试这个代码,它会为你工作。

    选中和取消选中复选框。

    import { Component } from '@angular/core';
    
    @Component({
      selector: 'my-app',
        styles: [`
        .hidden {
          display: none;
        }
        `],
      template: `<p *ngFor="let user of users">{{ user.name }} - {{ user.age }} </p>
    
       <div *ngFor="let user of users">
          <textarea name="{{user.name}}" id="{{ user.name }}" [class.hidden]="chkState"> </textarea>
          <input type="checkbox" id="{{ user.name }}" [checked]="chkState" (click)="change()"/>
          <p>{{user.name}}</p>
       </div>
    
      `
    })
    export class AppComponent { 
      public users: string;
      public chkState = true;
      change(): void {
        this.chkState = !this.chkState;
      }
      constructor() {
        this.users = [{name: 'User1', age: '21'}, {name:'User2', age:'31'}];
    
      }
    }
    

    Here is the plunker

    【讨论】:

    • 隐藏并显示所有文本区域,只想隐藏我未选中的文本区域。
    • 所以如果我取消选中 User1 它应该隐藏相对于 User1 的文本区域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 1970-01-01
    • 2018-03-07
    • 2015-12-07
    • 1970-01-01
    相关资源
    最近更新 更多