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

Angularjs中的指令模板函数有什么好处?

洪高扬
2023-03-14
问题内容

根据文档,a
template可以是一个带有两个参数的函数,分别为element和,attributes并返回表示模板的字符串值。它将当前元素替换为HTML的内容。替换过程将所有属性和类从旧元素迁移到新元素。

compile函数处理转换模板DOM。它包含三个参数elementattributes和和transclude函数。该transclude参数已被弃用。它返回一个link函数。

似乎a template和a
compile函数非常相似,可以实现相同的目标。该template函数定义的模板和compile功能修改模板DOM。但是,它可以在template函数本身中完成。我看不到为什么要在template函数外部修改模板DOM
。反之亦然,如果可以在compile函数中修改DOM,那么对函数的需求是template什么?


问题答案:

在将结果模板功能绑定到作用域之前,可以使用编译功能来更改DOM。

考虑以下示例:

<div my-directive></div>

您可以使用compile函数更改模板DOM,如下所示:

app.directive('myDirective', function(){
  return {

    // Compile function acts on template DOM
    // This happens before it is bound to the scope, so that is why no scope
    // is injected
    compile: function(tElem, tAttrs){

      // This will change the markup before it is passed to the link function
      // and the "another-directive" directive will also be processed by Angular
      tElem.append('<div another-directive></div>');

      // Link function acts on instance, not on template and is passed the scope
      // to generate a dynamic view
      return function(scope, iElem, iAttrs){

        // When trying to add the same markup here, Angular will no longer
        // process the "another-directive" directive since the compilation is
        // already done and we're merely linking with the scope here
        iElem.append('<div another-directive></div>');
      }
    }
  }
});

因此,compile如果指令需要,则可以使用该函数将模板DOM更改为所需的内容。

在大多数情况下tElemiElem它将是相同的DOM元素,但是有时,如果指令克隆模板以标记出多个副本,则它可能会有所不同(参见ngRepeat)。

在幕后,Angular使用2向渲染过程(编译+链接)来标记出已编译的DOM的副本,以防止Angular为每个实例一遍又一遍地处理(=解析指令)相同的DOM。以防该指令淘汰多个克隆,从而获得更好的性能。

希望有帮助!

评论后添加:

templatecompile函数之间的区别:

模板功能

{
    template: function(tElem, tAttrs){

        // Generate string content that will be used by the template
        // function to replace the innerHTML with or replace the
        // complete markup with in case of 'replace:true'
        return 'string to use as template';
    }
}

编译功能

{
    compile: function(tElem, tAttrs){

        // Manipulate DOM of the element yourself
        // and return linking function
        return linkFn(){};
    }
}

在调用编译函数之前,先调用模板函数。

尽管它们可以执行几乎相同的工作并共享相同的“签名”,但主要区别在于,模板函数的返回值将替换指令的内容(或完整的指令标记,如果replace: true),而编译函数则有望以编程方式更改DOM并返回链接功能(或具有链接前和链接功能的对象)。

从这种意义上讲,您可以将模板函数视为某种便捷函数,如果您只需要用字符串值替换内容,则不必使用编译函数。

希望有帮助!



 类似资料:
  • 问题内容: 在以下情况下如何使用包含。目的是在html(部分)文件中使用标记,而不是在模板中(在指令内)定义标记。 我在这里找到了一个很棒的树指令。( 来源)原文: http //jsfiddle.net/n8dPm/ 我没有在指令中定义模板,而是尝试使用包含在内的内容。我还将Angular更新为1.2.0.rc2。更新时间:http://jsfiddle.net/aZx7B/2/ 低于错误 Ty

  • 问题内容: 我正在尝试根据范围值使用不同的模板进行指令。 这是我到目前为止所做的,我不知道为什么它不起作用http://jsbin.com/mibeyotu/1/edit HTML元素: 指示: 问题答案: 1)您正在将内容作为属性传递到html中。试试这个: 代替: 2)指令的数据部分正在被编译,因此您应该使用其他东西。代替数据类型,例如datan-type。 链接在这里: http://jsb

  • 问题内容: 这是我的AngularJs指令。它原本希望在模板中显示div,但是在运行代码时却什么也没有显示。 这是HTML 这是AngularJS指令 这是演示 问题答案: 声明指令时,您使用了名称,但这是错误的。您应该使用,因为它将被转换为元素。 指令名称中的任何大写字母都将转换为连字符,因为元素中未使用大写字母。例如将翻译为。 正如其他人提到的,AngularJS使用以下标准化规则进行标准化:

  • 问题内容: 我正在使用SVG和angular.js进行大型项目,并且需要对svg指令模板的坚实支持。不幸的是,当angular渲染模板时,它将创建DOM节点,而不是SVG节点。我当前的解决方法是使用jquery.svg自己管理创建和删除节点,但是它受到限制。示例:http://plnkr.co/edit/Xk8wM3?p = preview 我想让指令成为实际的svg元素,而不是一些没有任何实际作

  • 问题内容: 最近,我遇到了AngularJS Strict DI模式。使用它的目的和好处是什么?通过特别在移动设备上使用它,我们是否可以显着提高性能? 我尝试将其应用于代码,编写代码时未做任何注释。但是,我要压缩代码,并在构建过程中进行ng- annotate。但是,为什么在将严格的DI模式添加到代码中后,仍然出现错误消息“需要显式注释”? 问题答案: 严格的DI模式基本上在运行时发现不符合最小化

  • 问题内容: 我花了很多时间阅读AngularJS文档和一些教程,对于文档的难懂性,我感到很惊讶。 我有一个简单的,可以回答的问题,对于其他希望使用AngularJS的人也可能有用: 什么是AngularJS指令? 某个地方应该有一个简单,精确的指令定义,但是AngularJS网站提供了这些令人惊讶的无用定义: 在主页上: 指令是AngularJS中可用的独特而强大的功能。指令可让您发明特定于您的应