有没有办法制定一个指令,以便它只能在某个其他指令中使用?

时间:2012-11-09 05:51:59

标签: angularjs

假设我有两个指令,my-awesome-tablemy-awesome-table-cell。我从不希望在my-awesome-table-cell指令之外使用my-awesome-table。有没有办法强制执行此操作?因此在my-awesome-table指令之外使用时会抛出错误吗?

2 个答案:

答案 0 :(得分:5)

您也可以通过获取外部指令将“控制器指令”放在DOM上,然后使内部指令“需要”此“控制器指令”来执行此操作。

请参阅此插件:http://plnkr.co/edit/QPNPu4。

app.directive('myAwesomeTable', function() {
  return {
    controller: function($scope) {},
    link: function(scope, element) {
      ...
    }
  };
});

app.directive('myAwesomeTableCell', function() {
  return {
    require: '^myAwesomeTable',
    link: function(scope, element, attributes, controller) {
      ...
    }
  };
});

您还可以使用?^将需求设置为可选,然后在链接函数内部检查要定义的控制器参数,如果您想对此进行细粒度控制。

答案 1 :(得分:1)

这不应该是一个问题,假设您可以控制自己的代码......但是,在这种情况下它成为一个问题,您可以检查您的链接功能,看看您的指令是否包含在正确的父指令:

app.directive('testChild', function() {
  return {
    restrict: 'E',
    template: '<div>child</div>',
    link: function(scope, elem, attr){
      if(elem.parents('test').length === 0) {
        throw new Error('Must be inside test directive');
      }
    }
  };
});

app.directive('test', function(){ 
  return {
    restrict: 'E',
    transclude: true,
    template: '<div>' +
      '<h3>parent</h3>' +
      '<div ng-transclude></div>' +
    '</div>'    
  };
});

测试加价:

  <test>
    <test-child></test-child>
    <test-child></test-child>
  </test>
  <!-- this will throw an error in JS -->
  <test-child></test-child>

备注

链接函数中的elem参数是一个JQuery LITE对象,除非你也引用了JQuery,那么它就是一个完整的JQuery对象。 JQuery Lite没有.parents()函数。您仍然可以检查父母,但如果可能,我建议您在这里使用JQuery。

要知道的另一件事是错误的指令仍然会呈现,除非你使用elem.remove()来解除链接函数中的错误。

此外,如果您在父指令上使用replace:true,则需要在其模板中放置一些内容以识别它,就像您可以使用parent()查询的类或属性一样调用