【问题标题】:AngularJS required radio buttons needs two click events to be validAngularJS 所需的单选按钮需要两个点击事件才有效
【发布时间】:2013-03-24 14:39:37
【问题描述】:

我有一个非常简单的表单,需要选择一个单选按钮才能使表单有效。单选按钮由ngRepeat 生成。

正如您从这个小提琴中看到的那样,虽然所需的行为是当第一次单击单选按钮时,应该验证表单(是唯一的元素),但是请注意它需要额外的点击(在相同的单选按钮或任何其他按钮)来验证表单:

http://jsfiddle.net/Xsk5X/3/

我错过了什么?

【问题讨论】:

  • jsfiddle.net/arunpjohny/FQRD7就更疯狂了
  • @ArunPJohny 是的,好像需要一些视图绑定才能“解决”验证状态
  • 这适用于 angular 1.0.2 和 1.0.3 中的刹车。由于1.0.3 中有很多更改可能导致此问题,我建议您打开issue
  • 这似乎更像是一种 hack,但如果您将 ng-click="" 添加到输入中,它似乎会强制进行摘要并更新您的表单:jsfiddle.net/XfAHe
  • @PaulSmith 对于遇到此问题的其他人,您能否将 Preston Badeer 的回答标记为正确?这是正确的解决方案,我刚刚验证了它。这也是投票最多的答案。丹尼尔的答案可能有效,但它是一个黑客。谢谢!

标签: angularjs


【解决方案1】:

对于 IONIC v1, 添加name="" 以防止离子自动生成属性name。 然后,我可以一键更改所选项目。

<ion-radio class="label-ticket" 
    ng-repeat="topic in vm.listTopic track by $index"
    ng-value="topic"
    ng-model="vm.topicSupport"
    name="">
    {{ topic.title }}
</ion-radio>

【讨论】:

    【解决方案2】:

    所有其他解决方案都是变通方法:您所要做的就是删除name 属性,当您使用ng-model 属性时,您不需要它并且它们会发生冲突。

    指定 name 会导致 Angular 感到困惑,因为它会更改 Angular 模型的值一次,并更改表单元素名称的值。

    【讨论】:

    【解决方案3】:

    我遇到了这个问题,因为一位同事复制了同一页面中的单选按钮并将它们隐藏以供临时参考,因此使用相同名称复制单选输入

    【讨论】:

      【解决方案4】:

      尝试将 ng-click 属性添加到您的单选按钮输入中。

      感谢 Manny D 首先注意到这一点。是的,这有点骇人听闻,但它确实有效。例如,

      <input type="radio" 
             name="groupName"  
             ng-model="editObject.Property"                             
             ng-value="someValue"
             ng-click />
      

      【讨论】:

      【解决方案5】:

      1.1.5仍然出现范围不更新的问题

      一个简单的解决方法是添加 &lt;span ng-show="false"&gt; {{name}} &lt;/span&gt;

      小提琴:http://jsfiddle.net/jonyschak/xaQJH/

      【讨论】:

        【解决方案6】:

        有时 $digest 循环不会 $apply(fn) 因为您有两个或多个实例。 为了解决这个问题,你需要手动 $apply 这个技巧,所以把它放在你的指令中:

        angular.('myApp',[])
        .directive('ngRadioExtend', ['$rootScope', function($rootScope){
                return {
                    require: 'ngModel',
                    restrict: 'A',
                    link: function(scope, iElm, iAttrs, controller) {
                        iElm.bind('click', function(){
                            $rootScope.$$phase || $rootScope.$apply()
                        });
                    }
                };
            }])
        

        并将其用作:

        <input type="radio" name="input_name" ng-model="some" value="F" ng-required="true" ng-radio-extend>
        
        <input type="radio" name="input_name" ng-model="some" value="M" ng-required="true" ng-radio-extend>
        

        DONE 这是正确的方法!

        【讨论】:

        • 这很好用!刚投了票。但对于 AngularJS 应该 能够自行解决的问题,它仍然感觉像是一种解决方法。
        • 我同意你的观点,希望能帮助到别人!谢谢!
        • 好吧,我只是通过在超时中包装$apply 调用使其工作:setTimeout( function() { $rootScope.$$phase || $rootScope.$apply(); })
        • 我认为这在脏检查时间上很昂贵,但如果您没有复杂的 UI,请继续使用 $apply。做这件事的正确方法是做一些非常简单的事情:把你的范围像 $scope.some 作为 $scope.some = { something : "somevalue" };完成!
        • 不要使用$rootScope.$$phase || $rootScope.$apply() - 它一直是一个hack,在最近的版本中已经被弃用(会导致错误)
        【解决方案7】:

        似乎是 AngularJS 1.0.3 $scope.$apply 更新问题。 在 1.0.2 中测试了您的确切 Fiddle(自己检查一下),它的工作方式也符合您的预期。

        您的代码似乎没有任何问题,只是 $scope.$apply(或 $digest) 在第一次选择时没有按预期工作。

        一个非常简单的解决方法是强制 $scope 在每次选择时也更新,尝试更改表单中的以下代码行:

        <p>Favorite Beatle</p>
        

        也改一下:

        <p>Favorite Beatle: {{name}}</p>
        

        您将看到 myForm.$invalid 是如何在第一次点击后更新的。

        我会尝试使用最新的 AngularJs 版本,如果那里也发生这种情况,请告诉我们。 我可以想到的另一个解决方案是设置默认选择的单选,这将导致 myForm.$invalid 从一开始就为假。您可以通过在控制器代码中添加以下行来做到这一点:

        $scope.name = "John";
        

        或您想要的任何默认名称。

        【讨论】:

          【解决方案8】:

          这是破坏的原因 - 是因为您将所有单选框设置为必需。结果,取决于您如何编写它 - angularjs 说它是无效的,因为并非所有内容都在某个时候被选中。

          解决方法是执行以下操作:

          Using checkboxes and required with AngularJS

          (检查第一个和第二个答案)。这将解决您的问题。

          【讨论】:

          • 另外 - 尝试更新 angularjs。它们现在已达到 1.0.5,因此可能值得更新,看看现在是否有更简单的解决方案。
          • 这对我不起作用,我不需要任何收音机盒子,但仍然有这个问题。
          • Tbh,这已经超过 2 岁了。它可能不再适用。从那时起,Angular JS 发生了很大变化(我相信在撰写本文时它是 0.8)。
          • 我想我找到了最新版本的修复,添加了我的答案。
          • 见上面的评论 ;)
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2022-07-01
          • 1970-01-01
          • 2014-08-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-29
          相关资源
          最近更新 更多