附加到元素父级的模板上的隔离范围

Posted

技术标签:

【中文标题】附加到元素父级的模板上的隔离范围【英文标题】:Isolated scope on template appended to element parent 【发布时间】:2018-06-22 02:15:10 【问题描述】:

我有以下指令:

app.directive("mydirective", ['$compile', function($compile) 
    function link(scope, element, attrs, ctrl, $transclude) 
        var actionBtnhtml = `<button type="submit" ng-show="show"></button>`;

        element.parent().append(actionBtnHTML);

        $compile(element)(scope);
    

    return 
        restrict: 'A',
        scope: ,
        link: link,
        controller: ['$scope', function MyDirectiveController($scope) 
            $scope.show = true;
        ]
]);

我的指令只是在带有 mydirective 属性的 HTML 标记之后添加一个按钮。

我希望添加的 HTML 与指令具有相同的范围(即新的隔离范围)。但在此配置中并非如此。我猜这是因为添加的 HTML 在指令 HTML 标记之外。

我的问题是,如何将指令的隔离范围应用于附加到父元素的模板?

【问题讨论】:

【参考方案1】:

您可以使用ngTransclude 插入额外的 HTML 内容,同时保持指令的相同范围。

directive("mydirective", ['$compile', function($compile) 

  return 
    restrict: 'A',
    scope: ,
    controller: ['$scope', function MyDirectiveController($scope) 
      $scope.show = true;
    ],
    transclude: true,
    template: '<ng-transclude></ng-transclude>' +
      ' <button type="submit" ng-show="show">Submit!</button>'
  
])

这是您的指令的demo fiddle!

【讨论】:

感谢您的回答!它运作良好,但它迫使我将原始 HTML 标记包装到具有指令属性的 div 中。不是很重要,但我想要一个不那么侵入性的指令。实际上,我设法通过在element.parent() 上应用$compile() 方法而不是element 来解决我的问题。我不知道这是否是正确的方法,但它似乎有效。

以上是关于附加到元素父级的模板上的隔离范围的主要内容,如果未能解决你的问题,请参考以下文章

如何为不是直接父级而是父级父级的嵌套元素设置百分比宽度?

将元素从一个父级移动到另一个父级的反应动画

css 将元素展开到100%父级的高度

jquery如何获得父级的父级元素?

包含到父级的JQuery Draggable和额外的一个

css如何让子元素不受父级的父级的overflow:hidden影响