【问题标题】:Checkbox disable in angular复选框禁用角度
【发布时间】:2021-02-22 04:29:27
【问题描述】:

我有一张桌子。我有一列只有复选框作为其中的值。我已经使用 for 循环将所有值放入表中。我所做的是当我启用一个复选框时,我显示了一条消息“嘿”当我启用一个复选框时(出现消息)但是当我启用另一个复选框时,消息消失了。当一个复选框被启用时,消息最初会出现。我需要的是,在所有复选框被禁用之前,消息应该在那里,即使有一个或多个复选框,消息也应该在那里。我正在用角度编写我的代码。

这是我的 stackblitz 链接 https://stackblitz.com/edit/angular-oswf2h?file=src%2Fapp%2Fapp.component.ts

【问题讨论】:

    标签: javascript html angular typescript checkbox


    【解决方案1】:

    您应该存储输入值并根据存储值提供结果。

    以ngModel 为例:

    checkedValues: boolean[] = this.a.map(() => false);
    
      get isChecked() {
        return this.checkedValues.some(b => b);
      }
    
    <div>
        <div class="Container" style="margin-left: 10px;">
            <div class="table-responsive">
                <table class="table">
                    <thead class="table_header">
                        <tr>
                            <th>Name</th>
                            <th>Checkbox</th>
                        </tr>
                    </thead>
                    <tbody>
                        <tr *ngFor="let b of a; let i = index">
                            <td>{{b.name}}</td>
                            <td> <input type="checkbox" id="vehicle1" name="vehicle1" [(ngModel)]="checkedValues[i]">
                            </td>
                        </tr>
                    </tbody>
                </table>
            </div>
        </div>
        <div *ngIf="isChecked">
            <h1>Hey</h1>
        </div>
    </div>
    

    更改堆栈闪电战:https://stackblitz.com/edit/angular-jwpane?file=src/app/app.component.html

    【讨论】:

    • 属性 a 在其初始化之前使用。我收到此错误。注意:我从服务中获取列表
    • 那么您可能需要将this.a.map(() =&gt; false); 移动到ngOnInit 或类似的东西
    • 嘿,它工作了,谢谢。你能解释一下代码吗?我无法理解代码?
    • 您的组件中有一个布尔数组 (checkedValues),它使用 false 进行初始化,并且长度与 a 相同。使用let i = index,您会收到迭代的当前索引,并将其传递给[(ngModel)] 值绑定。使用此绑定,值将存储在数组中。 getter isChecked 提供数组的“摘要”,它只告诉数组是否有任何真值。
    • some 是数组上的一个函数,它检查数组中的任何元素是否满足提供的谓词。谓词函数是b =&gt; b,其中b 是数组中的一个元素,所以它是一个布尔值。如果元素为真,我们想要返回真。在很长一段时间内你可以说b =&gt; b === true。显然,如果 b 为真,则该术语总是返回真,所以b =&gt; b
    【解决方案2】:

    我稍微修改了你的代码以使其正常工作。可能有很多方法可以做到这一点,但我决定尝试尽可能少的更改。

    存储每个单独复选框的检查状态。

    a = [
    { name: "a", check: false },
    { name: "b", check: false },
    { name: "c", check: false }
    ];
    

    在 checkBtn 按下从前端接收项目并检查所有项目以查看是否全部禁用

    checkBtn(b) {
        b.check = !b.check;
        let check = false;
        this.a.forEach(item => {
          if (item.check) {
            check = true;
          }
        });
        this.ischeck = check;
      }
    

    最终从前端传递项目

                <tr *ngFor="let b of a;">
                    <td>{{b.name}}</td>
                    <td> <input type=" checkbox" id="vehicle1" name="vehicle1"  (click)=" checkBtn(b)">
                    </td>
                </tr>
    

    【讨论】:

    • 我正在从服务中获取数据。所以我不能将检查值添加为 false.. 还有其他方法吗?@Einars Bistrovs
    【解决方案3】:

    问题是你所有的复选框都连接到同一个布尔值,所以他们只是切换它。当一个被点击时,不管哪一个,ischeck 都会得到true 的值。当一个复选框被点击时,无论是同一个还是不同的,它都会再次切换,所以现在ischeck 是false。 一种可能的解决方案是对每个复选框进行不同的检查,并根据逻辑 OR 显示消息。

    在此处查看this stackblitz solution

    更新的 ts 文件:

      ischeck: boolean = false;
      a = [
        { name: "a", isCheck: false },
        { name: "b", isCheck: false },
        { name: "c", isCheck: false }
      ];
    
      checkBtn(b: { name: string; isCheck: boolean }) {
        b.isCheck = !b.isCheck;
        this.ischeck = this.a.some(c => c.isCheck); // at least one item has checked as
      }
    

    并在 HTML 中进行更改:

    <input type=" checkbox" id="vehicle1" name="vehicle1"  (click)=" checkBtn(b)">
    

    编辑: 更新了代码以模拟从服务获取数据 ts模拟:

      a = [];
    
      ngOnInit() {
        this.a = [{ name: "a" }, { name: "b" }, { name: "c" }]; //returned from service
        this.a.map(v => { //data changes to add boolean
          return { ...v, isCheck: false };
        });
      }
    

    【讨论】:

    • 我正在从服务中获取数据。所以我不能将检查值添加为 false .. 还有其他方法吗? @PMO1948
    • @JoeRishwanth 是的,你可以映射它。当您从服务中获取数据时,将其映射为: data.map(d=>{return {...d, isChecked:false}})
    • 我要在哪里使用“data.map(d=>{return {...d, isChecked:false}})”代码?
    • 在您的服务回调中。如果它是可观察的,请使用 service.method().pipe(map(...))。如果不是,那么如果你有a=service.method(),你可以做a=service.method().map(...)
    • 我可以在 stackblitz 中发布我的服务并在此处更新吗?
    猜你喜欢
    • 2022-10-13
    • 1970-01-01
    • 2021-03-09
    • 2016-03-07
    • 2015-04-02
    • 2018-10-26
    • 1970-01-01
    • 2020-10-31
    • 2023-03-22
    相关资源
    最近更新 更多