Angularjs中的动态表单名称属性<input type =“text”name =“{{variable-name}}”/>

时间:2014-11-21 22:25:22

标签: javascript angularjs angularjs-directive angularjs-scope angularjs-ng-repeat

当动态创建“inputName”时,有人会如何使用formName.inputName。$有效?

  <form name="formName">
    <input ng-repeat="(variable) in variables"
           type="text" name="variable.name"
           ng-model="variable.name" required />
 </form>

HTML输入属性“name”的输出将是字符串“variablename”,它将应用于所有重复输入。

如果我们尝试了这个

<form name="formName">
  <input ng-repeat="(variable) in variables"
         type="text" name="{{ variable.name }}"
         ng-model="variable.name" required />
</form>

HTML输入属性“name”的输出将是字符串“{{variable.name}}”,它将应用于所有重复输入。

在这两个条件中的任何一个中,都不会动态创建每个重复输入元素的name属性;所有输入将共享相同的输入名称。如果您想根据特定名称调用特定输入,那就太好了。

  • 需要使用动态名称值
  • 需要能够调用$ scope.formName.dynamicName。$ valid
  • 需要能够调用$ scope.formName。$ valid
  • 需要将动态名称输入字段添加到嵌套表单或主表单

4 个答案:

答案 0 :(得分:20)

看起来Angular 1.3修复此问题(https://stackoverflow.com/a/32907176/3854385

现在可以使用Angular 1.3 +:

<form name="vm.myForm" novalidate>
  <div ng-repeat="p in vm.persons">
    <input type="text" name="person_{{$index}}" ng-model="p" required>
    <span ng-show="vm.myForm['person_' + $index].$invalid">Enter a name</span>
  </div>
</form>

Demo

在某些情况下,如果您只是传递信息,内部表格是一个很好的解决方案:(https://stackoverflow.com/posts/12044600/) 解决动态名称&#39;问题您需要创建内部表单(请参阅ng-form

<div ng-repeat="social in formData.socials">
      <ng-form name="urlForm">
            <input type="url" name="socialUrl" ng-model="social.url">
            <span class="alert error" ng-show="urlForm.socialUrl.$error.url">URL error</span>
            <button ng-click="doSomething(urlForm.socialUrl.$valid)">Test</button>
      </ng-form>
  </div>

另一种选择是为此编写自定义指令。

以下是显示ngForm使用情况的jsFiddle:http://jsfiddle.net/pkozlowski_opensource/XK2ZT/2/

答案 1 :(得分:2)

我找不到满足部分或全部这些需求的答案。这就是我提出的。

可能有更好的方法,所以请分享您的想法 我正在使用Angularjs 1.3.0-beta.8

我有一个包含多嵌套指令的表单,它们都包含输入,选择等等... 这些元素都包含在ng-repeats和动态字符串值中。

这是如何使用该指令:

<form name="myFormName">
  <nested directives of many levels>
    ex: <input ng-repeat=(index, variable) in variables" type="text"
               my-name="{{ variable.name + '/' + 'myFormName' }}"
               ng-model="variable.name" required />
    ex: <select ng-model="variable.name" ng-options="label in label in {{ variable.options }}"
                my-name="{{ variable.name + '/' + 'myFormName' }}"
        </select>
</form>

注意:如果需要序列化输入表,可以添加字符串并置索引;这就是我做的。但是,动态名称输入意味着您可能不知道表单输入的名称,因此您将如何调用$ scope.formName。??????。您可以迭代$ scope.formName对象以获取与特定值匹配的键。这意味着字符串连接如下:

my-name="{{ dynamicString + hello + '/' + 'myFormName' }}"

然后在$ scope.myFormName中,您可以通过迭代对象并收集包含&#39; hello&#39;的任何键来找到任何表单输入名称。

app.directive('myName', function(){

  var myNameError = "myName directive error: "

  return {
    restrict:'A', // Declares an Attributes Directive.
    require: 'ngModel', // ngModelController.

    link: function( scope, elem, attrs, ngModel ){
      if( !ngModel ){ return } // no ngModel exists for this element

      // check myName input for proper formatting ex. something/something
      checkInputFormat(attrs);

      var inputName = attrs.myName.match('^\\w+').pop(); // match upto '/'
      assignInputNameToInputModel(inputName, ngModel);

      var formName = attrs.myName.match('\\w+$').pop(); // match after '/'
      findForm(formName, ngModel, scope);
    } // end link
  } // end return

  function checkInputFormat(attrs){
    if( !/\w\/\w/.test(attrs.rsName )){
      throw myNameError + "Formatting should be \"inputName/formName\" but is " + attrs.rsName
    }
  }

  function assignInputNameToInputModel(inputName, ngModel){
    ngModel.$name = inputName
  }

  function addInputNameToForm(formName, ngModel, scope){
    scope[formName][ngModel.$name] = ngModel; return
  }

  function findForm(formName, ngModel, scope){
    if( !scope ){ // ran out of scope before finding scope[formName]
      throw myNameError + "<Form> element named " + formName + " could not be found."
    }

    if( formName in scope){ // found scope[formName]
      addInputNameToForm(formName, ngModel, scope)
      return
    }
    findForm(formName, ngModel, scope.$parent) // recursively search through $parent scopes
  }
});

这应该可以处理许多你不知道表单在哪里的情况。或者您可能有嵌套表单,但出于某种原因,您希望将此输入名称附加到两个表单中?好吧,只需传入要将输入名称附加到的表单名称。

我想要的是一种将动态值分配给我永远不会知道的输入的方法,然后只需调用$ scope.myFormName。$ valid。

这可能是一种矫枉过正,1.3+中存在更好的解决方案。在我拥有的时间里,我无法找到它。这对我来说很有用。

祝你好运!希望这有助于某人!!!!

答案 2 :(得分:0)

角度1.2.7

为我工作

指令:

var DynamicName = function() {
    return {
        restrict: 'A',
        priority: -1,
        require: ['ngModel'],
        link: function (scope, element, attr, ngModel) {
            ngModel[0].$name = attr.name;
        }
    };
};

app.directive('dynamicName', DynamicName);

howtouse:

<div ng-repeat="phone in hrModel.phones">
    <input type="text"
           name="phones[{{$index}}]"
           ng-model="phones[$index]"
           dynamic-name
    />
</div>

答案 3 :(得分:-1)

不要忘记您可以使用带有字符串索引的数组表示法来访问javascript对象。给定以下任意形式定义对象:

$scope.form_def = {
  form_name : 'BallForm',
  variables : [
    height : { name : 'Height', type : 'text' },
    width : { name : 'Width', type : 'text' },
    color : { name : 'Color', type : 'multi', options : ['red', 'green', 'blue'] }
  ]
};
$scope.form_values = {};

...和html片段......

<form name="{{ form_def.form_name }}">
  <div ng-repeat="variable in form_def.variables">
    <input ng-if="variable.type==='text'" type="text" name="{{ variable.name }}" ng-model="form_values[variable.name]">
    <select ng-if="variable.type==='multi'" name="{{ variable.name }}" ng-model="form_values[variable.name]">
      <option ng-repeat="opt in variable.options" value="{{ opt }}">{{ opt }}</option>
    </select>
  </div>
</form>

在控制器内部,您可以为每个字段提供一个很好的form_values对象,您可以通过迭代form_def.variables散列中的键来访问它。

一旦你开始编写这些通用的表单处理脚本,并且你最终会得到很多意大利面条代码,你会有更多的参与,你可能会更好地去做一般性的解决方案,但这是另一个问题。