【问题标题】:Javascript (Angular) nested directive loading twice due to $compile由于 $compile,Javascript(Angular)嵌套指令加载两次
【发布时间】:2016-09-08 01:50:52
【问题描述】:

我有一个嵌套在指令中的指令。为了满足我们设计师的需求,我要求内容是 DOM 节点的直接子节点。

  <div>
    <my-directive style="color: blue;">

      <p>Name: {{ ctl_a.fname }} {{ ctl_a.sname }}</p>
      <p>External Test: {{ xternal }}</p>

      <div>
        <nested-directive incoming="ctl_a.a_counter"></nested-directive>
      </div>

    </my-directive>
  </div>

让它正确加载的最佳选择是什么? IE“my-directive”可以访问ctl_a.fname,“nested-directive”可以访问$scope.incoming,作为“ctl_a.a_counter”传入的参数。

Here is a plunk 演示了我在使用 $compile 时遇到的问题。如果我使用 $compile,嵌套指令会执行两次。一次用于外部指令编译方法,再次用于手动编译方法。更糟糕的是,手册是唯一能正确呈现内容的。

如果我使用ng-transclude,那么传递给内部指令的所有属性都没有前缀 $$prevSibling 或 $parent,因为 ng-transclude 似乎创建了一个新范围。必须这样引用它似乎是根本错误的。

编辑:这是another plunk,它分叉了第一个。这次我将演示 ng-transclude 以及我需要如何使用 $parent 来访问控制器的指令。

谢谢。

【问题讨论】:

  • 那么,如果你最终自己编译,为什么还要让 Angular 编译内容呢?我也不确定你的实际问题是什么。
  • 让这个正确加载的最佳选择是什么? 如,我如何对这个标记进行角度处理,以便在模板变量包含的上下文中进行评估指令。因为 Angular 不会像现在这样编译这些。

标签: javascript angularjs angularjs-directive compilation


【解决方案1】:

您似乎没有使用 my-directive 的 data 属性。您可以从 my-directive 中删除以下代码。

    scope:{
        data: '='
     }

现在您不需要手动编译如下。所以也删除它。

$compile(element.contents())(scope);

工作plunkr

【讨论】:

  • 感谢您的浏览。我没有使用数据,但它证明我需要一个隔离的范围,并且我将传递东西。你的 plunk 工作的唯一原因是因为你已经删除了范围隔离。这是一个plunkr,展示了一个名为“arg”的参数被注入。
【解决方案2】:

我不确定您是否只想知道这些,但您需要将terminal: true 添加到您的指令定义对象中。这可以防止 Angular 在您自己编译之前处理 my-directive 标签中的 HTML。来自您的 plunker 的修改代码:

function myDirective($compile) {
  var directive = {
        compile: compile,
        controller: controller,
        controllerAs: 'ctl_a',
        replace: true,
        terminal:true, //<=======
        restrict: 'E',
        scope: {
            data: '='
        }
    };

    return directive;

【讨论】:

  • 这正是我所需要的。我从来不知道“终端”。这会停止摘要循环编译内容并给我空变量。非常感谢!
  • 大约 10 分钟前,我还找到了一种使用 ng-transclude 实现此目的的方法,该方法利用 javascript 功能通过引用将属性附加到对象。我也会在这里发布我的发现作为替代解决方案。
猜你喜欢
  • 1970-01-01
  • 2015-08-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-22
  • 2016-05-30
  • 2014-03-15
相关资源
最近更新 更多