【问题标题】:Angular ng-value doesn't work with input radioAngular ng-value 不适用于输入无线电
【发布时间】:2015-07-10 08:43:47
【问题描述】:

我有 3 个无线电输入绑定到 ctrl.poiType ,其中 ctrl 是控制器,而 poiType 是一个整数。 ctrl.poiType 可以具有由四个常量指定的 3 个值之一 (ctrl.TYPE_TRIP, ctrl.TYPE_EVENT, ctrl.TYPE_POI)。

所以我创建了三个输入收音机,使用 ng-model 和 ng-value,如下所示:

<label class="btn btn-default">
    <input type="radio" autocomplete="off" 
           ng-value="ctrl.TYPE_TRIP"
           ng-model="ctrl.poiType"  
           ng-change="ctrl.alert()"/>itinerari
</label>

如果ng-model 的值等于ng-value,则应检查无线电,但它不工作。我不知道为什么。

[更新] 这是示例的正确JS Fiddle

【问题讨论】:

  • 您需要阅读有关 Angular 的更多信息并阅读一些教程。您犯了许多重大错误,它们都列在您的浏览器控制台中。范围变量也需要$scope.foo,而不是this.foo。在开始实施之前花更多的时间在理论部分。 This 是一个很好的起点。
  • 我犯了一个错误的 JSFiddle... 现在我已修复它,请查看更新。我正在使用控制器的属性而不是范围变量。无论如何,最初的问题仍然存在
  • that 是你想要达到的目标吗?
  • 是的!所以我需要手动指定“活动”类?单选按钮不是自动的吗?
  • 不,您正在切换包含单选按钮(2 个不同元素)的按钮。选中的按钮也需要一个 CSS 类才能显示为选中状态,而单选按钮则不需要。

标签: javascript angularjs angular-ngmodel angularjs-ng-value


【解决方案1】:

我假设您要解决的问题是当您单击所选按钮时,它会显示为活动状态。由于您使用的是 Bootstrap 样式而不使用 Bootstrap javascript 组件,因此您需要自己在 Angular 中完成这项工作。

要使单选按钮显示为“选中”,您必须将活动样式应用于标签的类列表。

预选选项需要 .active

对于预选选项,您必须自己将 .active 类添加到输入的标签中。

在 Angular 中动态修改元素的类列表的方法是使用ng-class。您需要阅读该指令的文档,因为有几个选项可以让它发挥作用。

我已经更新了您的示例以使用 ng-class 指令,现在当您单击该按钮时它会显示为活动状态。

我不建议完全这样做,尤其是让你的控制器负责 CSS 类的部分,但这是一个很好的起点,可以让你找出在你的情况下最好的方法。

查看

<div>poiType is initialized to 0, so the first button should be selected
    <div ng-controller="TodoCtrl as ctrl" style="margin-bottom: 5px; padding: 5px; width:100%;">
        <div class="btn-group btn-group-justified">
            <label ng-class="ctrl.class(ctrl.TYPE_POI)">
                <input type="radio" ng-value="ctrl.TYPE_POI" ng-model="ctrl.poiType" />POI</label>
            <label ng-class="ctrl.class(ctrl.TYPE_TRIP)">
                <input type="radio" autocomplete="off" ng-value="ctrl.TYPE_TRIP" ng-model="ctrl.poiType" />itinerari</label>
            <label ng-class="ctrl.class(ctrl.TYPE_EVENT)">
                <input type="radio" autocomplete="off" ng-value="ctrl.TYPE_EVENT" ng-model="ctrl.poiType" />eventi</label>
        </div>ctrl.poiType = {{ctrl.poiType}}</div>
</div>

控制器

angular.module('epoiApp', [])

    .controller('TodoCtrl', function () {
    this.poiType = 0; // first button should be selected

    this.TYPE_POI = 0;
    this.TYPE_TRIP = 1;
    this.TYPE_WAYPOINT = 2;
    this.TYPE_EVENT = 3;
    this.class = function (poiType) {
        if (poiType == this.poiType) {
            return 'btn btn-default active';
        } else {
            return 'btn btn-default';
        }
    }
});

这是工作fiddle的链接。

【讨论】:

    【解决方案2】:

    我已经成功了:

    <div ng-app="myApp">
      poiType is initialized to 0, so the first button should be selected
      <div ng-controller="TodoCtrl"
           style="margin-bottom: 5px; padding: 5px; width:100%;">
        <div class="btn-group btn-group-justified" 
             data-toggle="buttons">
           <label class="btn btn-default">
              <input type="radio"  ng-value="TYPE_POI"
                   ng-model="poiType" 
                   ng-change="popup()"/>POI
            </label>
            <label class="btn btn-default">
               <input type="radio" autocomplete="off" 
                      ng-value="TYPE_TRIP ||
                                TYPE_WAYPOINT "
                      ng-model="poiType"  
                      ng-change="popup()"/>itinerari
            </label>
            <label class="btn btn-default">
              <input type="radio" autocomplete="off"  
                     ng-value="TYPE_EVENT"
                     ng-model="poiType" 
                     ng-change="popup()"/>eventi
            </label>    
         </div>         
       </div>         
    </div>
    

    您需要创建一个模块供您的 Angular 应用程序引用,这里我将其命名为 myApp 并在主 div 中声明它(通常,您希望在 body 标签中进行)。然后您可以创建一个控制器并使用scope 模块来初始化数据,然后如上所示使用它。 这是js。

    var myApp = angular.module("myApp", []);
    
    myApp.controller("TodoCtrl", function ($scope) {
        var that = $scope;
    
        $scope.poiType = 0;
    
        $scope.TYPE_POI = 0;
        $scope.TYPE_TRIP = 1;
        $scope.TYPE_WAYPOINT = 2;
        $scope.TYPE_EVENT = 3;
    
        $scope.popup = function () {
            alert(that.poiType);
        };
    });
    

    jsfiddle

    【讨论】:

    • 我已经更新了我的 jsfillde ...我正在使用控制器的属性而不是范围变量。它应该可以工作......无论如何,最初的问题仍然存在
    【解决方案3】:
        <div class="btn-group btn-group-justified" 
                 data-toggle="buttons">
    

    data-toggle="buttons" 正在隐藏单选按钮。如果您删除它,它将显示

    【讨论】:

    • 我知道这个答案被否决且无关紧要,但它帮助了我:)
    猜你喜欢
    • 1970-01-01
    • 2015-10-03
    • 2018-03-18
    • 1970-01-01
    • 2021-01-10
    • 1970-01-01
    • 2020-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多