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

在模板中使用原始元素类型的AngularJS指令

高泳
2023-03-14
问题内容

我正在为Angular开发基于UI和排版的指令。在这种情况下,该指令所应用的元素是未知的-从div,span,h1到h5的任何值。

使用模板的原因是我可以ng-*向其中添加指令(因此开发人员无需记住指令名称即可)。

我添加属性和重新编译元素的成功有限。ng- transclude但是,添加时没有成功。创建新元素并替换旧元素会带来集成问题(忽略元素上可能存在的其他指令和数据属性),复制这些属性并将其添加到新元素的效果很小。

这看起来应该真的很简单,因为template它本身可以将元素更改为您指定的任何内容(使用transcludereplace),肯定有“很长的路要走”吗?

太糟糕了,您不能执行以下操作:

module.directive( 'myDir', [ '$window', function( $window ) {
    return {
        restrict: "A",
        controller: function( $scope, $element ) {
            $scope.tag = $element[0].nodeName;
        }
        template: "<{{tag}} data-ng-transclude ng-*=''></{{tag}}>",
        transclude: true,
        replace: true,
        link: function ( scope, element, attrs ) {

        }
    }   
}]);

我认为主要的问题是我希望用模板替换和包含元素,而不是将模板(或编译元素)作为子元素添加

从那以后ng-*,我在代码中用香草JS 替换了对和模板的需要,例如:

<div data-ng-style="{'font-size':fontSize}></div>

element[0].style.fontSize = scope.fontSize;

哪个引起了使用许多ng-*指令的好处的问题?只是“成角度的方式”吗?


问题答案:

我已经考虑了这个问题几周了,直到我意识到这template可能是具有访问element和调用能力的函数attrs。因此,我能够返回带有现有元素标签的模板。

module.directive( 'myDir', [ '$window', function( $window ) {
    return {
        restrict: "A",
        template: function( element, attrs ) {
            var tag = element[0].nodeName;
            return "<"+tag+" data-ng-transclude ng-*=''></"+tag+">";
        },
        transclude: true,
        replace: true,
        link: function ( scope, element, attrs ) {

        }
    }   
}]);

HTML

<div data-my-dir>
    <span>some other stuff</span>
    <div>more stuff</div>
</div>

<span data-my-dir></span>

<h1 data-my-dir></h1>

输出量

<div ng-*="" data-ng-transclude="" data-my-dir="">
    <span class="ng-scope">some other stuff</span>
    <div class="ng-scope">more stuff</div>
</div>

<span ng-*="" data-ng-transclude="" data-my-dir=""></span>

<h1 ng-*="" data-ng-transclude="" data-my-dir=""></h1>


 类似资料:
  • 问题内容: 我有一个指令,可以在一个页面上多次使用。在此指令的模板中,我需要对输入元素使用ID,以便可以将Label“绑定”到它,如下所示: 现在的问题是,一旦多次包含我的指令,ID“ item1”就不再是唯一的,并且标签将无法正常工作(单击时应选中/取消选中该复选框)。 该问题如何解决?有没有一种方法可以为模板分配“名称空间”或“前缀”(例如asp.net使用ctl00 …- Prefix)?还

  • 问题内容: 我正在尝试实现自定义指令,以使html表中的列可排序。 HTML: JS: 指令模板: 因此,当我将其用作指令模板的根标记时,会检索到错误: 但是当我更改为或标记时,一切正常。 我究竟做错了什么? 问题答案: 我希望在上下文之外进行评估时,它会在某个中间点消失(将该模板放入您网页的某个随机部分以查看消失)。 在您的位置上,我将在模板中使用a ,更改为“ A”类型指令,并像以前一样使用a

  • 问题内容: 将一个类添加到元素时,我想向该元素添加另一个类。当一个类被删除时,我想删除一个元素。我基本上是将一些引导程序类映射到某些角度形式验证类,但是当从元素中添加/删除一个类时,我无法弄清楚如何触发我的代码(还要确保不要引起类更改的无限循环) 。 到目前为止,这是我的指令的内容: 因此,基本上,当添加到元素时,我想将bootstrap类添加到父元素。何时删除,我想删除。 我想在Angular中

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

  • 问题内容: 如何使用动态模板创建指令? 这就是我现在所拥有的,它可以正确显示标签。但是,我不确定如何在模板上附加其他HTML。或将2个模板合并为1个。 问题答案: 有类似的需求。做这份工作。(不完全确定这是否是“ THE”方法,仍然可以通过角度进行工作) http://jsbin.com/ebuhuv/7/edit-我的探索测试。 需要注意的一件事(以我的示例为例),我的要求之一是,一旦单击“保存

  • 问题内容: 我有一个简单的指令,其中模板在其中使用ng-repeat。我需要运行一些代码来针对ng- repeat指令创建的某些元素实例化jquery组件。问题是,如果我将此代码放在链接函数中。ng-repeat尚未构建这些元素,因此未实例化任何内容。 该模板如下所示。我正在尝试附加 我尝试使用$ watch()和$ observe()在域更改时注册回调,然后实例化工具提示代码。但是,我似乎无法在