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

用angularjs创建一个新指令

呼延才
2023-03-14
问题内容

所以我要创建一个简单的指令“ hover”,这是一个基本的导航菜单,当您将鼠标移到特定的aba上时,此aba会改变颜色。看我的脚本代码:

var app = angular.module('myModule', []);
app.directive('hover', function(){
    return{
        restrict: 'E',
        controller: function($scope) {
            $scope.hover    = null;
            $scope.selected = null;

            $scope.onHover = function (index){
                $scope.hover = index;
            }
            $scope.mouseLeave = function(){
                if($scope.selected)
                    $scope.hover = $scope.selected;
                else
                    $scope.hover = -1;
            }
            $scope.onClick = function(index) {
                $scope.hover    = index;
                $scope.selected = index;
            }

        },
        compile: function(el, attrs){
            el.children().attr('data-ng-mouseover', 'onHover('+attrs.index+')');
            el.children().attr('data-ng-mouseleave', 'mouseLeave()');
            el.children().attr('data-ng-click', 'onClick('+attrs.index+')');
            el.children().attr('data-ng-class', '{'+ attrs.onhover +': hover == ' + attrs.index + ' || selected == ' + attrs.index + '}');
        }
    }
});

现在我的HTML:

<ul>
    <hover index="0" onhover="hover"><li>Home</li></hover>
    <hover index="1" onhover="hover"><li>About Us</li></hover>
    <hover index="2" onhover="hover"><li>Contact</li></hover>
    <hover index="3" onhover="hover"><li>Share with us!</li></hover>
</ul>

这工作正常,但是当我以这种方式放置html时:

<ul>
    <li hover index="0" onhover="hover">Home</li>
    <li hover index="1" onhover="hover">About Us</li>
    <li hover index="2" onhover="hover">Contact</li>
    <li hover index="3" onhover="hover">Share with us!</li>
</ul>

这是行不通的,我必须用“ hover”标签包裹我的“ li”才能完成这项工作(是的,我正在将strict属性更改为“ A”),为什么呢?还有另一个问题,用“
hover”标签包装我的“ li”是验证我的html的坏招吗?

这是我的html编译的:

<ul>
<li onhover="hover" index="0" hover="" data-ng-mouseover="onHover()">Home</li>
<li onhover="hover" index="1" hover="" data-ng-mouseover="onHover()">About Us</li>
<li onhover="hover" index="2" hover="" data-ng-mouseover="onHover()">Contact</li>
<li onhover="hover" index="3" hover="" data-ng-mouseover="onHover()">Share with us!</li>
</ul>

当我将鼠标移到这些元素上时,不会调用我的函数“ onHover”。


问题答案:

首先澄清一下。

  • 我不建议过度使用$compile,有更好的方法将事件侦听器绑定到作用域。
  • 我为我解决了这个问题,以学习编译的工作原理并与他人分享。

在内处理模板元素时会发生什么compile function

  • 编译阶段将DOM从父元素迭代到子元素。
  • 当您在编译函数中操作DOM元素的$compile元素时,它会在这些子元素收集指令之前发生,因此,您对template元素的内容所做的每次更改都将被编译并与编译阶段的继续进行链接。
  • 当你操纵这是不是这样 的模板元素本身 ,那么$compile就不会寻找更多的指令在同一元素,因为它是 唯一收集每个每个DOM元素一次指令
  • 因此,您添加的这些属性只是不被编译!

让$手动编译它:

  • 我尝试添加,$compile(el)但是我的浏览器崩溃了( 不要嘲笑我 ),原因是它陷入了一个循环,无限循环地进行自我编译。
  • 因此,我删除了指令属性,然后$compile再次删除。
  • 我设置了{ priority:1001 } { terminal:true }。这是需要防止其他指令编译功能在我们的指令之前或手动编译之后运行的。

解:

这是一个小矮人:http
://plnkr.co/edit/x1ZeigwhQ1RAb32A4F7Q?p=preview

app.directive('hover', function($compile){
  return{
    restrict: 'A',
    controller: function($scope) {

       // all the code
    },

    priority: 1001, // we are the first

    terminal: true, // no one comes after us

    compile: function(el, attrs){

      el.removeAttr('hover'); // must remove to prevent infinite compile loop :()

      el.attr('data-ng-mouseover', 'onHover('+attrs.index+')');
      el.attr('data-ng-mouseleave', 'mouseLeave()');
      el.attr('data-ng-click', 'onClick('+attrs.index+')');
      el.attr('data-ng-class', '{'+ attrs.onhover +': hover == ' + attrs.index + ' || selected == ' + attrs.index + '}');

      var fn =  $compile(el); // compiling again

      return function(scope){
        fn(scope); //
      }
    }
  }
});


 类似资料:
  • 问题内容: 我创建了以下AngularJS指令来嵌入YouTube视频: 从模板调用它时,出现以下错误: 错误:[$ interpolate:noconcat]插值时出错:http : //www.youtube.com/embed/ {{code}}严格的上下文转义不允许在需要可信值时连接多个表达式的插值。参见http://docs.angularjs.org/api/ng。$ sce 我无法确

  • 问题内容: 我正在尝试创建一个指令,该指令将创建与创建指令的元素具有相同ng-model的输入字段。 到目前为止,这是我想到的: 的HTML 的JavaScript 但是,我不确定这是处理这种情况的正确方法,并且存在一个错误,即我的控件未使用ng-model target字段的值初始化。 这是上面代码的简称:http ://plnkr.co/edit/IvrDbJ 处理此问题的正确方法是什么? 编

  • 问题内容: 假设我有一个名为的课程, 我想创建一个新的ArrayList,其值将为type 。 我的问题是:我该怎么做? 我不懂Java Api。 我尝试了这个: 问题答案: 您正在寻找Java泛型 这是一个教程http://docs.oracle.com/javase/tutorial/java/generics/index.html

  • It doesn’t matter if you have an existing repository/directory of code, or if you are starting a completely new project, adding Yarn works the same way every time. In your terminal/console in the dire

  • 问题内容: 我有这样的设置: 控制器广播事件 指令侦听,然后通过append将其写入DOM,并以此创建指定指令的新元素。 IE浏览器: Angular从未调用过指令 当我检查DOM(并调试)时,我看到Controller 和指令正在执行其工作,并且有新的元素。 什么不见​​了?动态创建这些元素后需要做什么来触发指令调用? 问题答案: 请参阅。您可以类似于以下方式使用此服务: 这将执行新元素的编译和

  • 问题内容: 通常,每次用户按下键时,ng-model都会更新绑定模型: 在几乎所有情况下,这都非常有效。 但是我需要它在onchange事件发生时进行更新,而不是在onkeyup / onkeydown事件发生时进行更新。 在较旧的angular版本中,有一个ng-model-instant指令,其功能与现在的ng- model相同(至少对于用户而言,我对它们的实现一无所知)。因此,在较旧的版本中