当前位置: 首页 > 面试题库 >

在templateUrl覆盖AngularJS指令之前,检索它的内部HTML

夏弘义
2023-03-14
问题内容

我有一个指令,用于最近重构的表单验证样板。在扩展之前,请允许我进一步解释该指令。

指令用法:

<form class="form-horizontal" name="personalDetails" validated-form>

    <!-- Pass buttons into form through here -->
    <a href="" class="btn btn-success" 
        data-ng-click="saveDetails()"
        data-ng-disabled="!personalDetails.$valid">Save Changes</a>

</form>

以前,我的指令看起来像这样,并且 有效

app.directive('validatedForm', function($compile, $sce) {
    return {
        restrict: 'A',
        scope: true,
        link: function(scope, element, attrs) {

            var template = //... HTML boilerplate code
            var buttons  = element.html(); // Get contents of element before overriding

            element.html(template + buttons);
            $compile(element.contents())(scope);

        }
    }
});

html模板变得一团糟,我想将按钮包装在模板的“内部”,而不是在按钮之后。因此,我将其重构为我认为更好的指令。

app.directive('validatedForm', ['$compile', '$sce', function ($compile, $sce) {

    var domContent = null;

    return {
        restrict: 'AE',
        scope: true,
        templateUrl: '/Content/ngViews/directives/validated-form.html',
        link: function(scope, element, attrs) {

            // This now returns the contents of templateUrl 
            // instead of what the directive had as inner HTML
            domContent = element.html();

            // Scope
            scope.form = {
                caption: attrs.caption,
                location: 'Content/ngViews/forms/' + attrs.name + '.html',
                buttons: $sce.trustAsHtml(domContent),
                showButtons: !(domContent.replace(' ', '') === '')
            };

        }
    };
}]);

因此,我注意到的是element.html()现在检索templateUrl的内容,而不是我指令的内部HTML的内容。在指令被templateUrl覆盖之前,我还能如何获取指令的内容?


问题答案:

要访问初始html,可以$transclude在指令控制器内使用。与早期版本相比,此更改略有不同,因此假设使用1.2

controller:function($scope,$transclude){
      $transclude(function(clone,scope){
        /* for demo am converting to html string*/
         $scope.buttons=angular.element('<div>').append(clone).html();
      });

    }

**[DEMO](http://plnkr.co/edit/tArVj75kcE6atfjyhnK3?p=preview)**



 类似资料:
  • 我正试图找到在与自定义指令一起使用的ngRepeat中获取索引位置的最佳方法。我试图解决的问题是,对于ngRepeat的每次迭代,我希望知道我在迭代中的位置,这样我就可以根据索引位置创建自定义模板。 除非有更好的方法,否则我将尝试基于指令中的此留档执行此功能: http://docs.angularjs.org/guide/directive 我很难理解这个陈述到底在告诉我什么。所以,我试图做的是

  • 问题内容: 我想覆盖指令ng-click:在每次执行ng-click之前进行一些$ rootscope更改。怎么做? 问题答案: 您不能覆盖AngularJS内置指令。但是,您可以定义多个具有相同名称的指令,并使它们针对同一元素执行。通过为指令分配适当的值,您可以控制指令在内置指令之前还是之后运行。 该插件显示了如何构建在内置指令执行之前执行的指令。该代码也显示在下面。单击链接时,自定义将首先运行

  • 我试图在AngularJS中创建一个指令,将HTML拆分为可重用的部分: 应用程序/资产/脚本/产品/指令/产品.js: 但是,找不到模板: < code >错误:[$compile:tpload]无法加载模板:/templates/filter-template . html http://errors.angularjs.org/1.2.20/$compile/tpload?P0 =/temp

  • 问题内容: 我正在使用Jasmine编写AngularJS的指令测试,并与它们一起使用templateUrl:https : //gist.github.com/tanepiper/62bd10125e8408def5cc 但是,当我运行测试时,我得到了要点中包含的错误: 从我在文档中阅读的内容来看,我认为自己做得正确,但是事实并非如此-我在这里想念的是什么? 谢谢 问题答案: 如果您使用的是ng

  • 问题内容: 我有一个遗留应用程序,该应用程序通过jQuery将一些内容插入了DOM。我希望代码库的遗留部分负责编译它插入DOM中的html。 我可以使用来编译初始html ,但是除非我从指令内部调用,否则不会编译指令模板或templateUrl添加的任何DOM元素。 我在这里做错了什么? 链接到小提琴: http://jsfiddle.net/f3dkp291/15/ index.html app

  • 本文向大家介绍AngularJS内置指令,包括了AngularJS内置指令的使用技巧和注意事项,需要的朋友参考一下 指令,我将其理解为AngularJS操作HTML element的一种途径。 由于学习AngularJS的第一步就是写内置指令ng-app以指出该节点是应用的根节点,所以指令早已不陌生。 这篇日志简单记录了一些内置指令,先使用起来,再谈一些有趣的东西。 内置指令 所有的内置指令的前缀