【问题标题】:How to access DOM element of directive from another directive?如何从另一个指令访问指令的 DOM 元素?
【发布时间】:2016-06-17 22:57:15
【问题描述】:

我正在尝试访问指令链接功能中的 DOM 元素。该元素位于 another 指令的视图中。代码如下:

第一个指令

    (function () {
        'use strict';
        angular.module("testAPP",[])


        .directive('firstDirective', function(){
            var directive = {
                 restrict: 'E',
                 templateUrl: 'firstDirective.html'
                }
                return directive;
        })
  })();

第二条指令

(function () {
      'use strict';
       angular.module("testAPP",[])
        .directive('anotherDirective', function(){
             var directive = {
                restrict: 'E',
                templateUrl: 'anotherDirective.html',
                link: function($scope){
                  //element from another directive's view

                  var height = document.getElementByClassName("sky")[0].offsetHeight;
                }
             };
             return directive;

           });
     })();

有一个控制台错误提示 height 变量未定义。 我尝试了超时功能,这对我有用,但我认为这不是一个好的解决方案:

setTimeout(function(){
  var height = document.getElementByClassName("sky")[0].offsetHeight;
  console.log(height);
});

我也尝试了“require”,但它导致找不到指令的错误(我认为这可能是因为指令位于不同的目录中)

那么,你能告诉我 require 不起作用的原因,并建议我比 timeout 更好的解决方案

【问题讨论】:

  • 这是您在问题中提到的另一个指令,我只看到一个指令是 test-app
  • 它们是在另一个内部使用的吗..?
  • 不,这些指令位于不同的文件中

标签: javascript angularjs


【解决方案1】:

我认为,您的内容指令在您的第二个指令之前加载, 在您的内容指令中添加ng-if 可能会解决问题

    angular.module("testAPP",[])
                .directive('secondDirective', function(){
       var directive = {
       restrict: 'E',
       templateUrl: 'secondDirective.html',
       link: function($scope){
           $scope.scondDirctiveLoaded = true;
       }
     };
     return directive;
    });

<second-directive></second-directive>
<div ng-if="scondDirctiveLoaded">
    <content-directive  ng-if="scondDirctiveLoaded" ></content-directive>
</div>

【讨论】:

  • 你能写一个你的想法的小例子吗?我无法得到它
  • @KetevanToria 请立即查看
  • 添加 ng-if 对于给定的问题确实是一个糟糕的解决方案,甚至比使用超时更不是“好习惯”。即使它有效,它也不是一个好的解决方案。我强烈建议不要将此答案用于您的项目。它只不过是一种解决方法,会导致无法维护的复杂代码
【解决方案2】:

在 DOM 实际准备好之前实例化指令时会发生此错误。 $timeout 起作用,因为它延迟了对元素的抓取,直到 Angulars 下一个滴答周期 - 虽然这感觉像是一种反模式,但它似乎是一个可以接受的问题解决方案。

已经有类似问题的答案了。

How can I run a directive after the dom has finished rendering?

【讨论】:

    【解决方案3】:

    除了这似乎不是一个好主意而且会被认为是“不好的做法”这一事实之外 - 您必须更改指令的优先级才能让它们按顺序编译您需要它们进行编译,以确保当第二个指令尝试访问元素时第一个指令已准备就绪。

    【讨论】:

    • 超时方法证明第二个指令加载较晚,但我不知道原因。在 html 中它们被正确调用:
    • 如前所述,您必须更改它们的编译优先级才能使它们按照您希望它们编译的顺序进行编译。这与指令的 html 中的顺序无关。它是关于指令的“优先级”参数,您可以在角度文档中找到该参数
    • hm,我发现这很有用:priority 当在单个 DOM 元素上定义了多个指令时,有时需要指定应用指令的顺序。优先级用于在调用编译函数之前对指令进行排序。优先级被定义为一个数字。首先编译具有更高数值优先级的指令。预链接功能也按优先级顺序运行,但后链接功能按相反顺序运行。具有相同优先级的指令的顺序未定义。默认优先级为 0。谢谢
    猜你喜欢
    • 1970-01-01
    • 2013-10-26
    • 1970-01-01
    • 2021-09-30
    • 1970-01-01
    • 2015-07-29
    • 2014-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多