美文网首页我爱编程
AngularJS:Direcitve指令用法解读(下)

AngularJS:Direcitve指令用法解读(下)

作者: 阿羡吖 | 来源:发表于2018-03-12 16:15 被阅读0次

本篇转载于:http://blog.csdn.net/evankaka
AngularJs GitHub: https://github.com/angular/angular.js/
AngularJs下载地址:https://angularjs.org/
此文接 AngularJs:Directive指令用法解读(上)

8、transclude
如果不想让指令内部的内容被替换,可以设置这个值为true。一般情况下需要ngTransclude指令一起使用。

<!DOCTYPE html>  
<html lang="zh" ng-app="myApp">  
<head>  
    <meta charset="UTF-8">  
    <title>AngularJS入门学习</title>  
    <script type="text/javascript" src="./1.5.3/angular.min.js"></script>  
</head>
<body>
  <div sidebox title="Links">
      <ul>
          <li>First Links</li>
          <li>Second Links</li>
      </ul>
  </div>
</body>
<script type="text/javascript">
    var app=angular.module('myApp',[]);
    app.directive('sidebox',function(){
       return {
          restrict:'EA',
          scope:{
            title:'@'
          },
          transclude:true,
          template:'<div class="sidebox">\
                <div class="content">'\
                    <h2 class="header">{{title}}</h2>\
                    <span class=-"content" ng-transclude>\
                    </span>\
                </div>\
          </dvi>'
       };
    }) ;
</script>
</html>

结果:

image.png
transclude:false,时
image.png

**如果指令使用了transclude参数,那么在控制器无法正常监听数据模型的变化了。建议在函数里使用$watch
服务。
9、controller
可以是一个字符串或者函数。
若为字符串,则将字符串当做是控制器的名字,来查找注册在应用中的控制器的构造函数。

angular.module('myApp',[]).directive('myDirective',function(){
  restrict:'A', //始终需要
  controller:'SomeController'
})
//应用中其他的地方,可以是同一个文件或被index.html包含的另一个文件
angular.module('myApp').controller('SomeController',function($scope,$element,$attrs,$transclude){
  //控制器逻辑放在这里
})

也可以直接在指令内部的定义为匿名函数,同样也可以注入任何服务($log,$timeout等等)。

angular.module('myApp',[]).directive('myDirective',function(){
    restrict:'A',
    controller:function($scope,$element,$attrs,$transclude){
      //控制器逻辑放在这里
    }
})

另外还有一些特殊的服务(参数)可以注入
(1)$scope,与指令元素相关联的作用域
(2)$element,当前指令对应的元素
(3)$attrs,由当前元素属性组成的对象
(4)$transclude,嵌入链函数,实际被执行来用来克隆元素和操作DOM的函数。
注意,除非是用来定义一些可复用的行为,一般不推荐在这使用。

<!DOCTYPE html>  
<html lang="zh" ng-app="myApp">  
<head>  
    <meta charset="UTF-8">  
    <title>AngularJS入门学习</title>  
    <script type="text/javascript" src="./1.5.3/angular.min.js"></script>  
</head>  
<body>
  <hello mycolor="red">我是林炳文</hello>
</body>
<script type="text/javascript"> 
var app=angular.module('myApp',[]);
app.directive('hello',functiion(){
  return{
      restrict:"EA",
      translate:true,//注意此处必须设置为 true
      controller:function($scope,$element,$attrs,$transclude,$log){
          $transclude(function (clone){
              var a=angular.element('<p>');
              a.css('color',$attrs.mycolor);
              a.text(clone.text());
              $element.append(a);
          });
          $log.info("hello everyone")
      }
   } ;
});
</script>
</html>

输出结果:


image.png
image.png

并且在控制台下输出hello everyone
$transclude()它可以接受两个参数,第一个$scope作用域,第二个是带有参数clone的回调函数,而这个clone实际上就是嵌入的内容(经过jQuery包装),可以在它上面做很多的DOM操作。

它还有最简单的用法就是

<script>
  angular.module('myApp',[]).directive('mySite',function(){
      return {
          restrict:'EA',
          transclude:true,
          controller:function($scope,$element,$attrs,$transclude,$log){
            var a=$transclude();  //$transclude() 就是嵌入内容
              $element.append(a);
          }
      };
  });
</script>

使用$transclude会形成一个新的作用域
默认情况下,如果简单的使用$tancsclude(),那么默认的其作用域就是$transclude生成的作用域。
但是如果使用$transclude($scope,function(clone){}),那么作用域就是directive的作用域了。
如果想使用父作用域可以使用 $scope.$parent.
同理:想要的得到一个新的作用域也可以使用$scope.$parent.new();
10、controllerAs
这个选项的作用是可以设置你自己的控制器的别名。
11、require(字符串或者数组)
字符串代表一个指令的名字,它将会作为link函数的第四个函数。

<!doctype html>  
<html ng-app="myApp">  
<head>  
  <script src="http://cdn.staticfile.org/angular.js/1.2.10/angular.min.js"></script>  
</head>  
<body>  
<outer-directive>
  <inner-directive></inner-directive>
  <inner-directive2></inner-directive2>
</outer-directive>
<script>
  var app=angular.module('myApp',[]);
  app.directive('outerDirective',function(){
      return{
        scope:{},
        restrict:‘AE’,
        controller:function(){
          this.say=function(someDirective){
            console.log('Got'+someDirective.message);
          };
        }
      };
  });
app.directive('innerDirective',function(){
    return{
      scope:{},
      restrict:'AE',
      require:'^outerDirective',
      link:function(scope,elem,attrs,controllerInstance){
        scope.message="Hi,leifeng";
         controllerInstance.say(scope);
      }
    };
});
app.directive('innerDrective2',function(){
    return{
      scope:{},
      restrict:"AE",
      require:"^outDirective",
      link:function(scope,attrs,elem,controllerInstance){
        scope.message='Hi,shushu';
          controllerInstance.say(scope);
      }
    } 
})
</script>
</body>
</html>

上面的例子中的指令innerDirective和指令innerDirective2复用了定义在outDirective的controller中的方法也进一步说明了,指令中的Controller是用来让不同指令间通信的。

相关文章

网友评论

    本文标题:AngularJS:Direcitve指令用法解读(下)

    本文链接:https://www.haomeiwen.com/subject/widhfftx.html