Forms AngularJS-直接在<;表格>;要素

Forms AngularJS-直接在<;表格>;要素,forms,angularjs,angular-ngmodel,Forms,Angularjs,Angular Ngmodel,在AngularJS中,是否有任何方法可以直接在元素上声明ng模型,而不必在该表单的每个控件/输入上声明ng模型,然后通过其名称访问控制器中控件的值 具体来说,如果你有这样的表格 <form> <input type="text" name="email"> <input type="text" name="age"> </form> <form> <input type="text" ng-model="user.

在AngularJS中,是否有任何方法可以直接在
元素上声明ng模型,而不必在该表单的每个控件/输入上声明ng模型,然后通过其名称访问控制器中控件的值

具体来说,如果你有这样的表格

<form>
  <input type="text" name="email">
  <input type="text" name="age">
</form>
<form>
  <input type="text" ng-model="user.email">
  <input type="text" ng-model="user.age">
<form>
我想这样做:

<form ng-model="user">
  <input type="text" name="email">
  <input type="text" name="age">
</form>
我问这个问题的原因是,我正在对一个现有的web项目进行角度化,其中一些表单很容易有20或30个控件,并且单独定义ng模型似乎有些过分


我能找到的所有表单示例都在各个控件上声明ng模型。我还能够挖掘出这一点,基本上说,像这样的事情将需要一个重大的AngularJS大修,所以我怀疑这可能是不可能的。但是这张票是一年前的,也许从那以后情况已经改变了

有一个名为的自定义指令克服了这个问题。它使表单中的每个模型自动绑定到表单的ng模型

例如:

<form jfb-form-model="user">
    <input name="email" />
    <input name="age" />
</form>

将转到

<form jfb-form-model="user">
    <input name="email" ng-model="user.email"/>
    <input name="age" ng-model="user.age/>
</form>


开箱即用;不需要。但是您可以很容易地编写自己的指令来实现这一点

app.directive('lazyFormModel', function() {
  return {
    require: ['form'],

    compile: function compile(tElement, tAttrs) {

      var modelName = tAttrs.lazyFormModel;

      angular.forEach(tElement.find('input'), function(e) {
        var $e = angular.element(e);
        var name = $e.attr('name');
        $e.attr('ng-model', modelName + '.' + name);
      });
    }
  };
});
上面将创建一个指令,该指令将循环遍历所有包含输入的元素,并基于名称值在其上标记ng model属性。将其附加到表单元素,您就可以开始了:

<form lazy-form-model="user">
  <input type="text" name="email">
  <input type="text" name="age">
</form>

更新了。

这太好了,谢谢!我选择这个作为答案,因为jackypan1989答案中的角度模型的工作原理非常相似。您知道我如何扩展此功能以使用多个名称相同但值不同的复选框(输入的检查表类型)?更新了处理复选框的答案有一种通过
ng repeat
s使用动态输入的方法吗?@Ryeball有可能,但是您需要在
ng repeat
触发后触发的东西,AFAIK需要一些设置。如果你想的话,看看这个。
app.directive('lazyFormModel', function() {
  return {
    require: ['form'],

    compile: function compile(tElement, tAttrs) {

      var modelName = tAttrs.lazyFormModel;

      angular.forEach(tElement.find('input'), function(e) {
        var $e = angular.element(e);
        var name = $e.attr('name');
        $e.attr('ng-model', modelName + '.' + name);
      });
    }
  };
});
<form lazy-form-model="user">
  <input type="text" name="email">
  <input type="text" name="age">
</form>
angular.forEach(tElement.find('input'), function(e) {
  var $e = angular.element(e);
  var name = $e.attr('name');

  var modelProperty = modelName + '.' + name;

  if($e.attr('type') == 'checkbox') {
    modelProperty += '.' + $e.attr('value');
  }

  $e.attr('ng-model', modelProperty);
});