【问题标题】:Allow only one radio button to be selected from multiple groups of checkboxes只允许从多组复选框中选择一个单选按钮
【发布时间】:2015-08-06 14:03:27
【问题描述】:

我有许多帐户项。

我在列表中显示这些内容,例如

<md-list-item ng-repeat="item in items">

对于每一个这样的项目,我都会在一个组中显示三个单选按钮,包含类似的值

  • 管理员
  • 用户
  • 版主

现在用户可以为每组单选按钮选择一个值,但我想做的是只有一个管理员。

因此,如果选择了管理值,我应该阻止所有其他管理单选按钮。

如何做到这一点?

【问题讨论】:

  • 抱歉,您的标题显示复选框,而您的问题包含单选按钮?
  • @WayneEllery 对此感到抱歉,已修复。
  • 它是一组复选框还是单选按钮,因为您的问题说单选按钮,而小家伙仍然说复选框
  • 不,不,它的单选框,抱歉弄错了。
  • 定义only one admin。这可以用几种方式解释

标签: javascript angularjs


【解决方案1】:

有一个 ng-change 方法将管理项存储在范围属性中,以跟踪选择了管理项的项:

$scope.radioChanged = function (item) {
  if (item.selectedValue == "admin") {
    $scope.admin = item;
  }
  else if (item == $scope.admin) {
    $scope.admin = undefined;
  }
};

然后在管理员单选按钮上使用 ng-disabled,如果已选择管理员并且管理员不是当前项目,则该单选按钮将禁用。

<div ng-repeat="item in items">
  <label><input type="radio" name="{{item.id}}" value="admin" ng-model="item.selectedValue" ng-change="radioChanged(item)" ng-disabled="admin && item != admin"/>admin</label>
  <label><input type="radio" name="{{item.id}}" value="user" ng-model="item.selectedValue" ng-change="radioChanged(item)"/>user</label>
  <label><input type="radio" name="{{item.id}}" value="moderator" ng-model="item.selectedValue" ng-change="radioChanged(item)"/>moderator</label>
</div>

Plunkr

【讨论】:

  • 这可以更容易地与repeat一起使用,因此我相信大多数来这里的人都会对这个答案感兴趣。
【解决方案2】:

我会创建一个变量,可能是adminExists,当您在任何单选按钮上选择“管理员”时,该变量设置为true。然后,您可以禁用所有“管理”单选按钮 if(adminExists &amp;&amp; !isSelected),如果该单选按钮是被选中的管理按钮,则 isSelected 为真。

【讨论】:

  • 我确实尝试过这样做,但是有一个问题。单选按钮永远不会更新并被禁用。我不知道为什么。你能提供一个小提琴吗?
  • 只有在页面加载之前设置的变量才会被禁用,而不是在用户可能决定更改值的时间段内。
  • @dearn44 你应该提供演示并让其他人修改它。从头开始意味着要求其他人完成所有初始设置
  • @dearn44 但如果您在事件(点击)触发时尝试禁用它们,它们不会更新吗?
  • 你是对的,我应该提供一些东西给你,我会做一个快速演示等待。
【解决方案3】:

下面的代码检查所选单选按钮的值与其他单选按钮的值是否匹配(在这种情况下,如果值为“admin”)。然后它取消选择具有该值的所有单选输入元素,然后检查最初单击或选择的元素以将其设置为活动状态。如果您愿意,也可以更改函数以使用数据属性而不是值。

$(".group input[type=radio]").bind("click change keydown focus", function () {
    var el = $(this);
    var val = el.val();
    if (el.prop("checked", true) && val == "admin") {
        $(".group input[type=radio]").each(function () {
            if ($(this).val() == "admin") $(this).prop("checked", false);
        });
        el.prop("checked", true);
    }
});
.choice {
    display:block;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<form>
    <div class="group">
        <div class="choice">
            <input type="radio" name="group[0][]" value="admin" />
            <label>Admin</label>
        </div>
        <div class="choice">
            <input type="radio" name="group[0][]" value="user" />
            <label>User</label>
        </div>
        <div class="choice">
            <input type="radio" name="group[0][]" value="moderator" />
            <label>Moderator</label>
        </div>
    </div>
    <div class="group">
        <div class="choice">
            <input type="radio" name="group[1][]" value="admin" />
            <label>Admin</label>
        </div>
        <div class="choice">
            <input type="radio" name="group[1][]" value="user" />
            <label>User</label>
        </div>
        <div class="choice">
            <input type="radio" name="group[1][]" value="moderator" />
            <label>Moderator</label>
        </div>
    </div>
</form>

【讨论】:

  • 为什么这被否决了?有什么问题吗?尽管我选择了 Johns 的答案,但由于方法不同,我还是投了赞成票。
  • @downvoter,我想知道为什么这也被否决了。我相信这个答案可以满足 OP 的要求,而不是禁用输入,我使用的方法仍然允许某人改变主意,选择成为一个组的管理员而不是另一个组
  • 这个问题是一个有角度的问题,你用 jQuery 解决方案回答了它。
猜你喜欢
  • 2018-08-01
  • 1970-01-01
  • 2014-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2010-11-02
相关资源
最近更新 更多