首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >使用AngularJS在表单中进行动态验证和命名

使用AngularJS在表单中进行动态验证和命名
EN

Stack Overflow用户
提问于 2013-01-17 19:47:51
回答 9查看 99.5K关注 0票数 99

我有这个表单:http://jsfiddle.net/dfJeN/

如您所见,输入的name值是静态设置的:

代码语言:javascript
复制
name="username"

,表单验证工作正常(添加一些内容并从输入中删除所有文本,必须显示一个文本)。

然后,我尝试动态设置Name值:http://jsfiddle.net/jNWB8/

代码语言:javascript
复制
name="{input.name}"

然后我将这个应用到我的验证中

代码语言:javascript
复制
login.{{input.name}}.$error.required

(此模式将在ng-repeat中使用),但我的表单验证失败了。它可以在我的浏览器中正确地解释(如果我检查了我看到的login.username.$error.required元素)。

有什么想法吗?

编辑:在控制台中记录作用域之后,

代码语言:javascript
复制
{{input.name}}

表达式不是插值表达式。我的表单是{{input.name}}属性,但没有用户名。

更新:从1.3.0-rc.3开始,name="{{input.name}}“正常工作,请查看#1404

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-01-17 21:04:10

你不能用这种方式做你想做的事情。

假设您正在尝试做的是需要动态地向表单添加元素,使用类似于ng-repeat的东西,您需要使用嵌套ng-form来允许对这些单独的项进行验证:

代码语言:javascript
复制
<form name="outerForm">
<div ng-repeat="item in items">
   <ng-form name="innerForm">
      <input type="text" name="foo" ng-model="item.foo" />
      <span ng-show="innerForm.foo.$error.required">required</span>
   </ng-form>
</div>
<input type="submit" ng-disabled="outerForm.$invalid" />
</form>

遗憾的是,这并不是Angular的一个有据可查的特性。

票数 177
EN

Stack Overflow用户

发布于 2014-01-25 00:18:46

使用嵌套的ngForm允许您从HTML模板中访问特定的InputController。但是,如果您希望从另一个控制器访问它,它不会有任何帮助。

例如:

代码语言:javascript
复制
<script>
  function OuterController($scope) {
    $scope.inputName = 'dynamicName';

    $scope.doStuff = function() {
      console.log($scope.formName.dynamicName); // undefined
      console.log($scope.formName.staticName); // InputController
    }
  }
</script>

<div controller='OuterController'>
  <form name='myForm'>
    <input name='{{ inputName }}' />
    <input name='staticName' />
  </form>
  <a ng-click='doStuff()'>Click</a>
</div>

我使用这个指令来帮助解决这个问题:

代码语言:javascript
复制
angular.module('test').directive('dynamicName', function($compile, $parse) {
  return {
    restrict: 'A',
    terminal: true,
    priority: 100000,
    link: function(scope, elem) {
      var name = $parse(elem.attr('dynamic-name'))(scope);
      // $interpolate() will support things like 'skill'+skill.id where parse will not
      elem.removeAttr('dynamic-name');
      elem.attr('name', name);
      $compile(elem)(scope);
    }
  };
});

现在,只要“dynamic -name”属性而不是“name”属性,就可以在需要的地方使用动态名称。

例如:

代码语言:javascript
复制
<script>
  function OuterController($scope) {
    $scope.inputName = 'dynamicName';

    $scope.doStuff = function() {
      console.log($scope.formName.dynamicName); // InputController
      console.log($scope.formName.staticName); // InputController
    }
  }
</script>

<div controller='OuterController'>
  <form name='myForm'>
    <input dynamic-name='inputName' />
    <input name='staticName' />
  </form>
  <a ng-click='doStuff()'>Click</a>
</div>
票数 44
EN

Stack Overflow用户

发布于 2014-04-14 23:57:38

根据Github上的讨论,这个问题应该在AngularJS 1.3中得到解决。

同时,这里有一个由@caitp@Thinkscape创建的临时解决方案

代码语言:javascript
复制
// Workaround for bug #1404
// https://github.com/angular/angular.js/issues/1404
// Source: http://plnkr.co/edit/hSMzWC?p=preview
app.config(['$provide', function($provide) {
    $provide.decorator('ngModelDirective', function($delegate) {
        var ngModel = $delegate[0], controller = ngModel.controller;
        ngModel.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
            var $interpolate = $injector.get('$interpolate');
            attrs.$set('name', $interpolate(attrs.name || '')(scope));
            $injector.invoke(controller, this, {
                '$scope': scope,
                '$element': element,
                '$attrs': attrs
            });
        }];
        return $delegate;
    });
    $provide.decorator('formDirective', function($delegate) {
        var form = $delegate[0], controller = form.controller;
        form.controller = ['$scope', '$element', '$attrs', '$injector', function(scope, element, attrs, $injector) {
            var $interpolate = $injector.get('$interpolate');
            attrs.$set('name', $interpolate(attrs.name || attrs.ngForm || '')(scope));
            $injector.invoke(controller, this, {
                '$scope': scope,
                '$element': element,
                '$attrs': attrs
            });
        }];
        return $delegate;
    });
}]);

JSFiddle上的演示。

票数 16
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14378401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档