通过element.find从父级检索子指令范围

时间:2016-01-27 13:26:12

标签: javascript angularjs angularjs-directive

我不能使用“要求”,因为我有一个指令,可以有许多不同的父母,我无法准确预测他们将是谁。我需要做的是在每个父节点中能够检索子指令的控制器或范围,并调用一个方法来禁用按钮。我有一个能够显示问题的傻瓜。

https://plnkr.co/edit/Od1mJZOq1ep54pj6k6ti?p=preview

  .directive('parent', function($compile, $rootScope) {
return {
  restrict: 'E',
  scope: {},
  templateUrl: 'parent.html',
  link: postLinkFunction
};

function postLinkFunction(scope, element, attributes) {
  var directive = element.find('child');
  var directiveScope = directive.isolateScope();

  console.log(directiveScope);
}
})
.directive('anotherParent', function() {
return {
  restrict: 'E',
  scope: {},
  templateUrl: 'parent.html',
  link: postLinkFunction
};

function postLinkFunction(scope, element, attributes) {
  var directive = element.find('child');
  var directiveScope = directive.isolateScope();

  console.log(directiveScope);
}
})
.directive('child', function() {
return {
  restrict: 'E',
  scope: {},
  controller: function($scope, $element) {
    var vm = this;

    $scope.isDisabled = false;

    $scope.disableMenu = function () {
      $scope.isDisabled = true;
    };

    $scope.number = 1;
  },
  templateUrl: 'child.html'
};
});

即使我已经填充了isolateScope,它也是空的,而且子指令必须有隔离范围不能与父级共享范围,并且正如我所说我不能使用require。从理论上讲,element.find方式很简单,但很容易实现,但我不能使它工作。感谢任何帮助,提前谢谢!

2 个答案:

答案 0 :(得分:4)

在角度链接过程中,从上到下执行过程,因此在您创建之前尝试获取子范围,您可以通过向范围添加函数并在单击时执行它来解决此问题:

  scope.click = function() {
    var directive = element.find('child');
    var directiveScope = directive.isolateScope();
    console.log(directiveScope);
  };
<div class="tabbable">
  <div class="tab-content">
    <child></child>
  </div>
  <button ng-click="click()">click</button>
</div>

https://plnkr.co/edit/HZruQMnkbs99H8I3lqoE?p=preview

答案 1 :(得分:1)

您的父模块应该通过隔离范围中的变量与子进行通信,如下所示:

firstName

这是有效的demo