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

您到底要使用transclude函数和克隆链接函数做什么?

夏侯俊美
2023-03-14
问题内容

从指令Angular
docs中
,我看到compile函数具有3个参数,其中一个是transclude。该文档提供的唯一解释是:

transclude-包含链接的函数:function(scope,cloneLinkingFn)。

我试图了解您在克隆链接功能中到底会做什么。我什至不知道将哪些参数传递给它。我发现了一个示例,该示例的一个参数clone似乎是一个HTML元素。还有其他可用参数吗?这到底是哪个HTML元素?我也在寻找可能transclude: 'element'在我的指令中使用。执行这些问题的答案时,用改变'element'来代替true

我通过简单的示例理解了包含,但似乎找不到更复杂的示例,尤其是使用transclude: 'element'。我希望有人可以对此提供更详尽的解释。谢谢。


问题答案:

编辑:完全更改我的答案,并将其标记为“社区Wiki”(对我而言毫无意义),因为当我回答此问题时我是完全错误的

就像@Jonah在下面指出的那样,这是一篇关于指令的编译选项和使用包含函数的非常好的文章。

基本思想是编译函数应返回链接函数。您可以使用链接功能内部提供的包含功能来获取包含已插入的DOM元素的副本,对其进行编译,然后将其插入需要插入的位置。

这是一个更好的例子,我已经摆脱了对Plunker的支持

编译函数的思想是,您可以在创建和调用链接函数之前根据传递的属性以编程方式更改DOM元素。

// a silly directive to repeat the items of a dictionary object.
app.directive('keyValueRepeat', function ($compile){
  return {
    transclude: true,
    scope: {
      data: '=',
      showDebug: '@'
    },
    compile: function(elem, attrs, transclude) {

      if(attrs.showDebug) {                
        elem.append('<div class="debug">DEBUG ENABLED {{showDebug}}</div>');
      }

      return function(scope, lElem, lAttrs) {
        var items = [];
        console.log(lElem);
        scope.$watch('data', function(data) {

          // remove old values from the tracking array
          // (see below)
          for(var i = items.length; i-- > 0;) {
            items[i].element.remove();
            items[i].scope.$destroy();
            items.splice(i,1);
          }

          //add new ones
          for(var key in data) {

            var val = data[key],
                childScope = scope.$new(),
                childElement = angular.element('<div></div>');

            // for each item in our repeater, we're going to create it's
            // own scope and set the key and value properties on it.
            childScope.key = key;
            childScope.value = val;

            // do the transclusion.
            transclude(childScope, function(clone, innerScope) {
              //clone is a copy of the transcluded DOM element content.
              console.log(clone);

              // Because we're still inside the compile function of the directive,
              // we can alter the contents of each output item
              // based on an attribute passed.
              if(attrs.showDebug) {                
                clone.prepend('<span class="debug">{{key}}: {{value}}</span>');
              }

              //append the transcluded element.
              childElement.append($compile(clone)(innerScope));
            });

            // add the objects made to a tracking array.
            // so we can remove them later when we need to update.
            items.push({
              element: childElement,
              scope: childScope
            });

            lElem.append(childElement);
          }
        });
      };
    }
  };
});


 类似资料:
  • 我喜欢克隆一个表格,从每个单元格中去掉EUR这个词。我尝试使用.RemoveByContent但得到错误“不是函数”。 这是我的代码: 下面是表格: 如何删除克隆元素中的字符串?

  • 本文向大家介绍为什么要使用克隆?相关面试题,主要包含被问及为什么要使用克隆?时的应答技巧和注意事项,需要的朋友参考一下 克隆的对象可能包含一些已经修改过的属性,而 new 出来的对象的属性都还是初始化时候的值,所以当需要一个新的对象来保存当前对象的“状态”就靠克隆方法了。

  • 问题内容: 我开始学习Python,并且遇到过生成器函数,这些函数中包含yield语句。我想知道这些功能确实可以解决哪些类型的问题。 问题答案: 生成器为您提供懒惰的评估。您可以通过遍历它们来使用它们,可以显式地使用“ for”,也可以隐式地将其传递给任何迭代的函数或构造。您可以将生成器视为返回多个项目,就像它们返回一个列表一样,但是与其一次一次返回它们而不是一次全部返回它们,而是将生成器功能暂停

  • 问题内容: Animal animal = new Animal(101); //Constructor is executed. 问题答案: 类中给定方法的默认实现不调用任何构造函数。 它创建对象的“浅表副本”,因为它通过创建新实例然后通过分配复制内容来创建对象的副本,这意味着 如果您的Class包含可变字段,则原始对象和克隆都将引用同一内部对象 。 尝试看看此页面。

  • Javassist的API似乎允许我们创建类中声明的类初始值设定项(即静态构造函数)的精确副本: 但是,该副本还包括(公共/私有)静态最终字段。例如,以下类的静态构造函数: 事实上是: 因此,静态构造函数的精确副本也将包括对最终字段“名称”的调用。 有没有办法创建不包含对final字段的调用的静态构造函数的副本? --谢谢

  • 本文向大家介绍什么是JavaScript中的函数链接?,包括了什么是JavaScript中的函数链接?的使用技巧和注意事项,需要的朋友参考一下 功能链 函数链接不过是使用点表示法将函数分组在一行中而已。这种类型的链接使代码非常简洁,并提高了性能。在这里,我们将学习使用常规对象进行函数链接。 a)没有功能链  在以下示例中的对象“OBJ”被创建并在该对象中的公共属性 称为“I”是使用关键字创建“这个