【问题标题】:Disable clicking on checkbox; let parent div handle the禁用单击复选框;让父 div 处理
【发布时间】:2019-05-04 15:11:35
【问题描述】:

我有一个动态创建的表单,它有一个简单的列表(在 ngFor 中创建),它有:

  • 处理点击的父 div:它选择或取消选择当前项。
  • 该 div 的子复选框,应该显示给定项目的选中/未选中状态。

如果单击 div,一切都会按预期进行,但如果单击复选框,则不会发生任何事情。就像复选框中的点击与 div 的点击相撞,根本没有改变值。

到目前为止,我发现的“最干净”的解决方案根本不是一个干净的解决方案,因为我仍然无法单击复选框,但至少它不会给我这种奇怪的功能。看看吧:

  <div class="popup-elem" *ngFor="let option of selectedCategory?.options" (click)=" option.active = !option.active"
    [ngStyle]="option.active == true 
              ? {'background-color':'aliceblue'} 
              : {'background-color':'white'}">
    <input type="checkbox" [checked]="option.active" style="z-index:550" [disabled]="true">
    {{ option.name }}
  </div>

我用 NgModel 等尝试了其他东西,但到目前为止,这是我所拥有的最好的。如果至少可以在单击复选框时触发 div 的单击事件,我会很高兴,但我不知道该怎么做。

有什么想法吗?

【问题讨论】:

  • 您的问题到底是什么?你的代码看起来不错!是否要“重新启用”复选框?
  • 问题是,如果我单击复选框(未禁用时),它不会做任何事情。我需要单击 div 才能选择/取消选择项目。对于喜欢点击复选框而不是父组件的那种用户来说,这是有问题的。

标签: javascript html angular


【解决方案1】:

好的,我终于找到了一个解决方案,虽然并不完美,但效果很好,我很满意。它不允许我通过单击父 div 进行选择,但最终结果几乎相同。

  <div class="popup-elem" *ngFor="let option of selectedCategory?.options"
    [ngStyle]="option.active == true 
              ? {'background-color':'aliceblue'} 
              : {'background-color':'white'}">

    <label class="container"> {{ option.name }}
      <input type="checkbox" (change)="option.active = !option.active" [checked]="option.active">
      <span class="checkmark"></span>
    </label>

这样,当我单击该容器的复选框、文本或填充时,该项目会被正确选择。这并没有真正解决事件委托从父 div 到子复选框被破坏的问题,但是通过设置更高的填充,您实际上可以实现相同的用户体验,这就是我想要。

我希望这对偶然发现这个烦人问题的其他人有用!

【讨论】:

    【解决方案2】:

    如果您想重新启用复选框并获得正确的行为,您应该为复选框上的点击事件添加一个处理程序以更改模型:

    <input type="checkbox" [checked]="option.active" style="z-index:550" (click)="flip($event, option)" />
    

    在你的控制器中添加一个处理程序:

    flip($event, option) {
        option.active=$event.target.checked;
    }
    

    【讨论】:

    • 不起作用。如果我在执行此操作后单击复选框(两个选项),它不会做任何事情。
    • 抱歉,我无法测试。我编辑了我的答案。顺便问一下,你有小提琴吗?
    • 我不知道如何创建一个 Angular fiddle,无论如何,我认为在帖子中已经解释了发生了什么。
    • 我设法让它在小提琴上工作(我从this one开始)。我重新编辑了我的答案。
    • 刚刚设法解决了这个问题,请检查我的答案!我认为(更改)事件钩子在这里效果最好。无论如何,必须赞成你的答案,因为这个看起来也很有趣
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-16
    • 2014-02-12
    • 1970-01-01
    • 2021-04-09
    相关资源
    最近更新 更多