来自$ scope的AngularJS以编程方式获取表单控制器

时间:2014-02-27 03:10:47

标签: angularjs angularjs-scope

无论如何,我可以从范围访问表单控制器,而不知道用户为表单名称定义了什么。

通常,我们会以这种方式访问​​表单控制器:

$form['register_form']

但是,我正在寻找可以在不知道表单名称的情况下访问表单控制器的方法。示例:

$form[$scope.form_name]

我假设有来自$ scope本身的表单名称或表单控制器的引用。

2 个答案:

答案 0 :(得分:5)

您可以使用

访问表单
angular.element(el).inheritedData('$formController');

这将获得对元素父表单的引用。

我创建了一个plunker示例here。但是,我不会像在示例中那样在控制器中执行此操作。我将您需要父表格的任何逻辑放入指令中。像这样:

.directive('myDirective', function() {
      return {
        require: '^form',
        restrict: 'A',
        controller: ['$scope', function($scope){
           $scope.$watch('form', function(val){
               // some controller logic
           });
        }],
        link: function(scope, element, attrs, frm) {
          scope.form = frm;
          // your other logic
        }
      };
    });

答案 1 :(得分:1)

如果表单不在$scope中,您可以自己将其放在那里。例如,可以使用名为form的新指令,因为AngularJS允许多个同名指令。

这是一个非常天真的版本:

.directive("form", function () {
  function link (scope, el, attr, ctrl) {
    scope.forms = scope.forms || [];
    if (scope.forms.indexOf(ctrl) === -1) {
      scope.forms.push(ctrl);
    } 
  }
  return {
    restrict: "E",
    link: link,
    require: "form"
  }
})

我做了什么:

  1. 创建了将在form元素上初始化的新指令。
  2. 必需的原始form指令控制器。
  3. 通过scope.forms收集曝光。
  4. JSBin