让Directive动起来link()

在前面几节中,我们都是在学习如何配置Directive。下面,我们将开始学习Directive最灵活的部分,link()函数。

link()函数的基本使用方法如下:

  1. App.directive("formDirective", function () {
  2. return {
  3. restrict: "A",
  4. scope:{
  5. a:"=",
  6. b:"=",
  7. c:"="
  8. },
  9. link: function(scope, element, attrs){
  10. console.log(scope);
  11. console.log(JSON.stringify(element));
  12. console.log(JSON.stringify(attrs));
  13. }
  14. }
  15. });

link()带有三个参数,scope,element,attrs。为了更好的了解link函数三个参数的意义,函数中加上了日志输出的console.log的命令。

scope未加上JSON.stringify转变为json格式输出,是因为scope本身涉及循环引用,因此无法转化为json。

对应的HTML代码:

  1. <div form-directive a="1" b="2" c="3"></div>

在Chrome的”开发者工具”的控制台中,我们可以看到如下结果:

  1. Scope
  2. {$id: 3, $$childTail: null, $$childHead: null, $$prevSibling: null, $$nextSibling: null…}
  1. //element
  2. {"0":{"ng339":7},"length":1}
  3. //attrs
  4. {
  5. "$attr":{
  6. "formDirective":"form-directive",
  7. "a":"a",
  8. "b":"b",
  9. "c":"c"
  10. },
  11. "$$element":[{"ng339":7},1],
  12. "formDirective":"",
  13. "a":"1",
  14. "b":"2",
  15. "c":"3"
  16. }

在这里,我们最主要的是观察最下方的attrs部分。我们可以看到,在这个Directive元素中传入的数据,都可以通过attrs获取到,这也是我们在link()中获取数据的主要方法。

element

element被转义成json的文本中很难获取任何实质的信息,但是,这里才是整个Directive中的核心部分

element与jQuery的关系

在Directive中,我们不免需要对页面元素进行操作。为了提供这项功能,AngularJS几乎原版搬运了jQuery操作元素的功能,他们称之为”jQuery Lite”(jqLite)。

AngularJS通过jqLite的调用方法angular.element,实现了jQuery中的大部分常用功能。也就是,我们可以在获取了element参数后,调用jQuery常用的语法,如bind(),addClass(),removeClass()等来直接对元素进行操作,实现我们期望的功能。

同时,如果你希望在AngularJS中直接使用完整的jQuery也是非常容易的。只需要安装jQuery,并在index.html中,保证在angular.js引入之前引入jQuery.js。AngularJS会自动将angular.element绑定到jQuery上。也就是,在Directive中,会自动使用jQuery来解析界面元素,我们获取的element会自动变为jQuery对象。

在AngularJS中使用jQuery

安装和使用jQuery共有两步:

  • 通过bower安装jQuery
  1. bower install jquery --save
  • index.html中引入jquery.js
  1. <!-- 保证在angular.js之前引入jquery.js -->
  2. <script type="text/javascript" src="components/jquery/dist/jquery.js"></script>
  3. <script type="text/javascript" src="components/angular/angular.js"></script>

实际体验element的功能

我们在引入jQuery后,可以通过如下代码查看效果:

这里需要注意的是,使用jqLite的方法和以下代码中使用的方法是不一样的,因为jqLite不支持通过标签方式获取子元素。如果您有兴趣学习jqLite的使用方法(并且拥有一定的英文阅读能力),可以在这里查看官方文档。

  1. App.directive("formDirective", function () {
  2. return {
  3. restrict: "A",
  4. template:"<h1>标题</h1><p>这里是段落文字</p>",
  5. link: function(scope, element, attrs){
  6. element.children("h1").addClass("strike");
  7. }
  8. }
  9. });
  1. <div ng-controller="FirstCtrl">
  2. <div form-directive></div>
  3. </div>

图5-12 element的使用

element上绑定鼠标移入移出时的变化效果

  1. App.directive("formDirective", function () {
  2. return {
  3. restrict: "A",
  4. template:"<h1>标题</h1><p>这里是段落文字</p>",
  5. link: function(scope, element, attrs){
  6. element.children("h1").bind("mouseenter", function(){
  7. element.children("h1").addClass("strike");
  8. element.children("h1").text("鼠标移过来了");
  9. });
  10. element.children("h1").bind("mouseleave", function(){
  11. element.children("h1").removeClass("strike");
  12. element.children("h1").text("鼠标移开了");
  13. })
  14. }
  15. }
  16. });

运行时,当鼠标移动到标题上,则标题文字会变化成”鼠标移过来了”,并加上删除线效果;当鼠标移开,则文字会变为”鼠标移开了”。

图5-13 element的使用

因为主要是jQuery的用法,更多的实际应用就不在本书中详述了。如果有兴趣学习jQuery,您可以通过上网搜索或者购买书籍的方式来学习。