当前位置: 首页 > 知识库问答 >
问题:

AngularJS:如何设置基于自定义布尔值的有效性

华煜祺
2023-03-14

我想基于自定义布尔值设置表单元素的有效性。考虑下面的密码字段:

<input type="password" name="password" ng-model="user.password" required>
<input type="password" name="passwordRepeat" ng-model="user.passwordRepeat" required>

如果重复的密码与原始密码匹配,我想标记第二个输入字段有效。类似的东西:

<input type="password" name="passwordRepeat" ng-model="user.passwordRepeat" my-validation-check="user.passwordRepeat === user.password" required>

为此,我找不到任何角度指示。有什么想法吗?也许我可以为此制定自己的指令?不幸的是,我不是一个角度专家。。。应该是这样的:

angular.module('app').directive('myValidationCheck', function() {
    return {
        scope: true,
        require: 'ngModel',
        link: function(scope, elm, attrs, ngModel) {
            // eval and watch attrs.myValidationCheck
            // and use ngModel.$setValidity accordingly
        }
    };
});

谢谢

共有3个答案

公良浩邈
2023-03-14

请看下面的演示

var app = angular.module('app', []);

app.directive('mcheck', function() {
  return {

    require: 'ngModel',
    link: function(scope, elm, attrs, ngModel) {

      scope.$watch(attrs.ngModel, function(value) {



        if (value == attrs.mcheck) {
          ngModel.$setValidity('notEquals', true);


        } else {

          ngModel.$setValidity('notEquals', false);

        }




      });

    }
  };
});


app.controller('fCtrl', function($scope) {



});
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>

<div ng-app="app">
  <div ng-controller="fCtrl">
    <form novalidate name="login">
      <input type="text" name="password" ng-model="user.password" mcheck="{{user.passwordRepeat}}" required>



      <input type="text" name="passwordRepeat" ng-model="user.passwordRepeat" mcheck="{{user.password}}" required>
      <HR/>
      <span ng-show="login.password.$error.notEquals && login.passwordRepeat.$error.notEquals && login.$dirty">Passwords are not equal</span>
      <HR/>


    </form>
  </div>
</div>
吴松
2023-03-14

你为什么需要特殊的指令?

为何不这样做:

<div ng-controller="MyCtrl">
  <form name="myForm" ng-submit="processForm()"> 
      <input type="password" ng-model="password" placeholder="password" required/>
      <input type="password" ng-model="repeatedPassword" placeholder="repeat password" required/>
      <input type="Submit" value="Submit" ng-disabled="passwordsMissmatched()"/>
      <span ng-show="passwordsMissmatched()">
          Password mismatched
      </span>
   </form>
</div>

还有你的JS:

function MyCtrl($scope) {
    $scope.passwordsMissmatched = function(){
        return $scope.password && $scope.repeatedPassword 
               && ($scope.password != $scope.repeatedPassword);
    }

    $scope.processForm = function(){
        if($scope.password == $scope.repeatedPassword){
            alert("Form processing..");
        }
    };
}

这种方法应该非常有效。

我已经为您创建了JSFIDLE。

邢运良
2023-03-14

我花了相当多的时间根据你下面的答案找到最好的答案(非常感谢!)。对我来说,诀窍很简单:

angular.module('myApp').directive('myValidationCheck', function() {
    return {
        scope: {
            myValidationCheck: '='
        },
        require: 'ngModel',
        link: function(scope, elm, attrs, ngModel) {

            scope.$watch('myValidationCheck', function(value) {
                ngModel.$setValidity('checkTrue', value ? true : false);
            });

        }
    };
});

对于

<input type="password" name="passwordRepeat" my-validation-check="user.password === user.passwordRepeat" ng-model="user.passwordRepeat" required>

这是非常灵活的。您可以在我的验证检查中使用任何您想要的内容,例如,确保选中复选框或任何更复杂的表达式为真。

希望这不仅仅对我有帮助…-)

 类似资料:
  • 在对XML文件应用转换时,我得到了这个错误(即,未定义有效的布尔值)。这里有一个奇怪的陷阱: *我的应用程序从一个文件位置读取500到800个XML文件(XML文件大小范围从几KB到10MB),然后对每个文件进行转换。最初一切都很顺利,但在一些执行之后,它会在错误下面抛出: productsfromloc_v3.xsl: forg0006第651行错误:在xsl:call-template nam

  • 我正在使用MPAndroidChart显示一个相对简单的条形图。 有2件事我需要设置,我不知道如何自定义: > 我需要为每个条添加文本,而不是简单的值,每个条本身也有样式。 在每个条的顶部,我需要放置各种类型的可绘制材料来覆盖它的宽度(例如一个条中高度为2dp的蓝色,或另一个条上高度相同的黄色渐变)。 下面是我需要做的一个演示: > 我知道我也可以通过使用添加图标,但这似乎不适用于应该使用整个条形

  • 问题内容: 我有一个表单,用于答复仅在为true 时才想显示的消息,每次单击答复按钮时,我都希望切换是否显示该表单。我怎样才能做到这一点? 问题答案: 您只需要在ng-click事件上切换“ isReplyFormOpen”的值

  • 问题内容: 我必须通过angularjs从某些网站获取json数据。我已经按照下面的链接正确地完成了所有操作。 我的问题是api不允许回调参数具有除字母,数字和_之外的任何字符。而且由于angular用’angular.callbacks._0’之类的东西替换了JSON_CALLBACK,所以不允许使用它。 如何自定义为angularjs设置此值? 谢谢 问题答案: 回调名称在此处为硬编码http

  • 我有一个布尔值,我需要设置一个基于这个布尔值的条件。我试图得到这个布尔值,然后用它在我的FutureBuilder,但我总是得到空,即使我可以看到值是在火还原。请帮助。 小装置

  • 我知道MapStruct可以忽略未映射的属性和特定的目标属性,但是否可以根据属性的实际值来删除属性? 我有布尔字段,只有当它们为false时,我才想排除它们。 提前感谢! 示例: 实体: DTO: MapStruct映射器: 我只想在布尔变量的值为“false”时完全排除它们。