添加输入的AngularJS指令

时间:2013-06-24 21:02:46

标签: angularjs angularjs-directive

我有一个AngularJS指令,其模板中有一个输入元素。现在,我可以在<form>标记内添加此指令,并绑定ng-model而不会出现任何问题。

我遇到的问题是,动态添加到<form>的输入未显示在formContoller中,无法进行正确的验证。

是否有办法让<form>包含的指令具有自己的范围,能够动态添加将包含在指令所包含的formController中的输入?

更新

因此,当我尝试构建更简单的示例时,我确实找出了问题的根本原因,这就是我使用$compile生成所使用模板的事实。我在plunker上创建了一个简化版本的问题:

http://plnkr.co/edit/XsyZKW?p=preview

AngularJS代码

angular.module('directive', []).directive('containerDir', function() {
  return {
    scope: {
      test: '@'
    },
    compile: function(element, attributes) {
      return function(scope, element, attributes) {
        scope.model = {
          dataObject: {}
        }
      };
    }
  };
});

angular.module('directive').directive('inputDir', function($compile) {
  return {
    template: '<span></span>',
    scope: {
      model: '=dataModel'
    },
    compile: function(element, attributes) {

      return {
        pre: function(scope, element, attributes) {
          var template = '<input type="text" name="username" ng-model="model.username" required />';
          element.html($compile(template)(scope));
        },
        post: function(scope, element, attributes) {
        }
      };
    }
  };
});

模板

<!doctype html>
<html ng-app='directive'>
  <head>
  <script data-require="jquery" data-semver="2.0.1" src="http://code.jquery.com/jquery-2.0.1.min.js"></script>
    <script src="http://ajax.googleapis.com/ajax/libs/angularjs/1.1.5/angular.min.js"></script>
    <script src="script.js"></script>

  </head>
  <body>
    <div container-dir>
      <form name="testForm" nag-resettable-form style="padding-left: 20px;">
        <div>
          <label for="first-name">First Name</label>
          <input id="first-name"
                 type="text"
                 name="firstName"
                 ng-model="model.dataObject.firstName"
                 required
          />
          <div>value: {{model.dataObject.firstName}}</div>
          <div>{{testForm.firstName.$error | json}}</div>
        </div>
        <div>
          <label for="username">Username</label>
          <span input-dir data-data-model="model.dataObject"></span>
          <div>value: {{model.dataObject.username}}</div>
          <div>{{testForm.username.$error | json}}</div>
        </div>
        <div>
          {{testForm | json}}
        </div>
        <div style="padding-top: 1rem;">
          <button class="primary" ng-click="model.submitForm()">Submit</button>
          <button ng-click="resetForm(formReveal, {}, model.resetForm)">Reset</button>
        </div>
      </form>
    </div>
  </body>
</html>

这是一个相同的例子,没有使用$ compile来表明它没有它可以工作:

http://plnkr.co/edit/i8Lkt1?p=preview

现在我仍然想知道我是否尝试通过使用$compile生成指令的HTML的指令动态添加输入元素。

虽然我 可能 能够重写有问题的指令而不使用$compile,但我仍然想知道这是否可能以供将来参考

0 个答案:

没有答案