【问题标题】:[disabled]="ChooseButton" making all buttons disabled[disabled]="ChooseButton" 禁用所有按钮
【发布时间】:2017-07-30 02:27:59
【问题描述】:

我有一个 *ngFor,它给了我特定的商品清单,我点击一个特定的按钮来选择它们。当我单击我的选择按钮时,它会暂时禁用该按钮,直到我从后端获得响应。当我收到来自后端的响应时,按钮变为活动状态以取消选择该项目。

我在这里面临的问题是,当我单击选择按钮时,它会暂时禁用列表中的所有按钮。但我想要的是只禁用单击的按钮。

我的 HTML 代码 sn-p:

<ion-card *ngFor="let list of list_Array;>  
 <ion-card-content >
        <p style="color: #666; " [innerHTML]="list.item"></p>
      </ion-card-content>  
    <button ion-button color="secondary" clear (click)="activeButton(list._id)" *ngIf="list.isAlreadyChosen==true" [disabled]="ChooseButton">
              <div class="chosen" 
                    ng-class="{'chosen': isChosen}">
                  <p >choose</p>
              </div>
      </button>
     <button ion-button color="secondary" clear (click)="activeButton(list._id)" *ngIf="list.isAlreadyChosen==false"  [disabled]="ChooseButton" >
              <div class="choosen" 
                    ng-class="{'chosen': isChosen}">
                  <p >choose</p>
              </div>
      </button>
    </ion-card> 

【问题讨论】:

    标签: html angular ionic-framework ionic2


    【解决方案1】:

    答案 1: 正如@Pankaj Parkar 的回答所说-list_Array 中的每个项目都需要有自己的标志chooseButton,而不是为所有项目设置一个通用标志,以便仅禁用单击的按钮。

    现在,假设您已加载您的list_Array。您可以使用以下 for 循环将这个属性添加到它并最初将其设置为 false:

    for(var i = 0; i < list_Array.length; i++){
        list_Array[i]['chooseButton'] = false;
    }
    

    现在,将列表作为参数从您的 UI 代码传递给 activeButton(list) 方法,例如:(click)="activeButton(list)"(请记住在此处传递整个对象而不是 list._id,就像您所做的那样)。

    现在,用你的方法:

    activeButton(list) { 
        list.chooseButton = !list.chooseButton;
    }
    

    在这里,我已将 list.chooseButton 否定为之前的值(true -> false 或 false -> true)。希望这会有所帮助。

    答案 2: 您的list_Array 中已经存在list.isAlreadyChosen。 只需在第一个按钮中执行 [disabled]="!list.isAlreadyChosen" 并在第二个按钮中执行 [disabled]="list.isAlreadyChosen" 即可解决您的问题。简单。 ;)

    【讨论】:

    • 请看第二个答案。 ;)
    • 当我按照您的第二个答案进行操作时,它使已选择的按钮禁用并启用了未选择的按钮。但功能应该保持不变,我也可以取消选择已经选择的项目
    • 我刚刚再次编辑,将第一个按钮中的 list.isAlreadyChosen 标志反转为 !list.isAlreadyChosen,反之亦然。这是你想要的吗?基本上,我在这里说的是操纵list.isAlreadyChosen 变量而不是创建另一个变量。
    • 就像我们在 facebook 上的功能一样,首先你可以点赞图片,然后你可以删除点赞。这正是我想要的方式。它以这种方式工作,但是在您的第二个答案中,一旦我将其标记为已选择/未选择,它就会卡住。但是 pankaj 建议的方式可以按需要工作。感谢您的宝贵答案,我将在其他模块中使用它,因为它是我需要的。
    【解决方案2】:

    这是实现此目的的另一种方法:

    //component
    disableMe:boolean[];
    
    disableThis(id){
       this.disableMe[id] = !this.disableMe[id];
    }
    
    //template
    <button ion-button color="secondary" clear (click)="activeButton(list._id); disableThis(list._id)" *ngIf="list.isAlreadyChosen==true" [disabled]="disableMe[list._id]">
                  <div class="chosen" 
                        ng-class="{'chosen': isChosen}">
                      <p >choose</p>
                  </div>
    </button>
    

    【讨论】:

      【解决方案3】:

      目前您有ChooseButton 全局标志,这就是为什么一旦您更改该标志,它就会反映在组件上下文中的任何地方。

      ChooseButton 属性设为每个集合元素的本地属性,即list.ChooseButton

      [disabled]="list.ChooseButton"
      

      为了应用上述内容,您应该将activeButton 函数更改为下面,然后在按钮的click 上传递list 对象,例如(click)="activeButton(list)"

      功能

      activeButton (item) { 
          item.ChooseButton = true;
          console.log("listId", item._id);
      }
      

      【讨论】:

      • 那么我如何在我的类型脚本文件中使其为真或假,目前我正在使用它,如 activeButton = function (listId) { this.ChooseButton = true;在我得到我的 api 调用响应后,我将其设为 this.ChooseButton=false }
      • 它给了我一个错误,比如'Cannot create property 'ChooseButton' on string '58bfc0e3733305f5e'' 这个字符串是所选项目的 ID
      • @devanshsadhotra你必须在 (click)="activeButton(list)" 上传递对象,而不是字符串。
      • 您可以在加载 list_Array 后使用 for 循环,并在每个循环上创建 chooseButton 属性。将为此添加另一个答案。
      • @SagarKulkarni 是的,您的解决方案有效,但它增加了应用端的时间复杂度。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 1970-01-01
      • 2018-07-10
      • 1970-01-01
      相关资源
      最近更新 更多