在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用

Posted

技术标签:

【中文标题】在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用【英文标题】:Radio buttons binding is not working when a data-toggle attribute is added in AngularJS + Bootstrap 【发布时间】:2016-01-03 03:54:58 【问题描述】:

我正在使用 AngularJS 和 Twitter Bootstrap,我想让两个单选按钮看起来像普通的 Bootstrap 按钮。我在 jsFiddle 上找到了this example,在将它应用到我的案例之后,一切看起来都很好,但它无法正常工作。

我想将单选按钮绑定到 Angular 中的模型。这是我的代码:

<div class="btn-group btn-group-lg btn-group-justified" data-toggle="buttons">
    <label class="btn btn-default">
        <input type="radio" name="isMad" ng-model="isMad" ng-value="false" /> No
    </label>
    <label class="btn btn-default">
        <input type="radio" name="isMad" ng-model="isMad" ng-value="true" /> Yes
    </label>
</div>

<h1>
    I am mad:  isMad 
</h1>

这是单击“否”(单选)按钮的结果:

因此,模型根本不受约束。当我从按钮组中删除 data-toggle 属性时,一切正常,但单选按钮显示在 Bootstrap 按钮的顶部,如下图所示:

我应该怎么做才能让 Bootstrap 按钮在第一张图片中看起来像这些,并在第二张图片中正确使用 AngularJS 模型绑定?

【问题讨论】:

你试过为每个输入元素设置唯一的ID吗? @br3w5 - 是的,还是不行 Angular 和 Bootstrap 并不总是能很好地配合使用...angular-ui.github.io/bootstrap/#/buttons 提供了一个指令,用于使用 bootstrap 和 angular 实现单选按钮 还有这个***.com/questions/19150988/… ng-change,ng-click dont work with data-toggle="buttons" since v1.3.0的可能重复 【参考方案1】:

我猜你不是唯一一个对这个问题生气的人。目前我面临同样的问题。

让我告诉你我的解决方法:

 <div class="btn-group">
    <label class="btn btn-info" ng-class=" active : model === 'value1' ">
      <input type="radio" ng-model="model" value="value1" class="hide"> value 1
    </label>
    <label class="btn btn-info" ng-class=" active : model === 'value2' ">
      <input type="radio" ng-model="model" value="value2" class="hide"> value 2
    </label>
  </div>

要理解的关键点是删除data-toggle="buttons",它添加了导致错误的额外javascript逻辑。然后在同一输入中隐藏带有class="hide" 的复选框,然后根据您的支持模型对象的值“手动”设置活动状态。

希望这会有所帮助!

【讨论】:

刚刚发现这个问题在 Angular 6 中仍然存在 - 删除 data-toggle 修复了它 正如@ozz 所说,Angular 6 中仍然存在这个问题,我通过删除data-toggle="buttons" 并将[class.active]="option == 'value'" 添加到标签中解决了这个问题。但是我不需要将class="hide" 添加到任何&lt;input&gt;s【参考方案2】:

这是我在以前的项目中使用自定义指令处理范围的方法。以这种方式使用具有隔离范围的自定义指令是可选的。使用 ng-controller 它仍然可以为您工作 - 不同之处在于在控制器中设置单选按钮而不是 html,然后使用 ng-repeat 进行渲染。 (working Plnkr)

半径.html

<div class="row">
  <div class="col-sm-12 col-md-12">
    <legend class="required">Choose a radius</legend>
  </div>
  <div class="col-sm-2 col-md-2">
    <fieldset>

        <div class="form-group" ng-repeat="radius in vm.radiusValues">
          <div class="check-radio">
            <label for=" radius.id "> 
              <input type='radio' name="radio" id=" radius.id " value=" radius.value "  ng-model="vm.radius"> radius.name  
            </label>
          </div>  
        </div>

    </fieldset> 

    <p>Selected value is  vm.radius </p>

  </div>
</div>

radius.directive.js

(function() 
    'use strict';

    angular
    .module('radius', [])
    .directive('radius', radius)
    .controller('RadiusCtrl', RadiusCtrl);

    function radius() 
        var directive = 
            bindToController: true,
            controller: 'RadiusCtrl',
            controllerAs: 'vm',
            replace: true,
            restrict: 'E',
            scope: ,
            templateUrl: 'radius.html'
        ;

        return directive;
    

    function RadiusCtrl() 
        var vm = this;

        vm.radius = 500;

        vm.radiusValues = [
            name: '100m', value: 100, id: 'groupidrad1',
            name: '500m', value: 500, id: 'groupidrad2',
            name: '1000m', value: 1000, id: 'groupidrad3',
            name: '2000m', value: 2000, id: 'groupidrad4'
        ];
    
)();

index.html 的正文

<body>
    <radius></radius>
</body>

【讨论】:

【参考方案3】:

明智的编码是正确的。好像您没有使用正确的Angulerjs 版本。你用的是哪个版本? 试试 1.3

【讨论】:

我用 1.3.8 试过了,同样的代码对我来说效果很好。

以上是关于在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用的主要内容,如果未能解决你的问题,请参考以下文章

17AngularJS Bootstrap

在 AngularJS + Bootstrap 中添加数据切换属性时,单选按钮绑定不起作用

使用 AngularJS 在 Bootstrap 选项卡中重新加载数据

新手问题,AngularJS,bootstrap modal 怎么获取数据

使用 JavaScript 在 AngularJS Bootstrap UI 中调用模式窗口

AngularJs的UI组件ui-Bootstrap分享