首页 > 代码库 > AngularJS-directive.js 基本指令

AngularJS-directive.js 基本指令

这个文件中包括了一些项目中用到的小指令,例如导航条,广告条等。

指令部分很复杂,不能全部进行说明,这里先把项目用到的点简单说明一下吧,详细的在单独介绍。

指令中有很多配置,下面进行说明:

restrict:表示这个指令时说明类型,如何来进行调用,有四个属性可以进行设置,E(只限元素明使用)A(只限属性使用)C(只限类名使用)M(只限注释使用),可以多选,一般常用的就是EA,这也时默认值。

link:之前一直对link和compile搞不太清,直到查了查资料才稍微理解了一下:

    在angular启动之前,应用会进行编译和链接,这个时候作用于会和html进行绑定,这个过程包含两个阶段,其中编译阶段也就是compile就是在编译阶段运行的,所以在这个阶段,我们操作添加和删除dom是安全的(虽然angular不主张进行dom操作)

    通常设置了compile函数,说明我们希望在指令和实时数据被放到dom之前进行dom操作,

    link函数:在compile函数最后返回的一个回调函数,其实就是link函数,在编译过后会进行链接,这个函数也时我们经常用到的,compile在开发中,不是很常用到。

    区别:compile函数的作用是对指令的模板进行转换

      link的作用是在模型和视图之间进行关联,包括元素上进行事件监听。

      socpe在链接阶段才会被绑定到元素上,因此在compile中使用scope是会报错的。

        对于同一个指令的多个实例,compile只会执行一次,而link对于每个实例都会执行一次。

      如果编写的compile中包含了link函数,那么link函数无效,程序会把compile函数当做返回函数处理。

scope:scope有三个值,分别是 true false {} 下面分开介绍

      false : 表示继承并使用同一个作用域,也就是说指令内部发生变化,那么外部所对应的变量也会变化。

    true: 表示继承并新建作用域,也就是说可以继承外部的作用域,但是在指令内部会新建一个副本,内部变化并不会影响到外部的变量 

   {}:可以在内部指定需要继承的变量,有三个值可以使用@,&, 

      @

      这是一个单项绑定的前缀标识符
      使用方法:在元素中使用属性,好比这样<div my-directive my-name="{{name}}"></div>,注意,属性的名字要用-将两个单词连接,因为是数据的单项绑定所以要通过使用{{}}来绑定数据。

      =
      这是一个双向数据绑定前缀标识符
      使用方法:在元素中使用属性,好比这样<div my-directive age="age"></div>,注意,数据的双向绑定要通过=前缀标识符实现,所以不可以使用{{}}。

      &
      这是一个绑定函数方法的前缀标识符
      使用方法:在元素中使用属性,好比这样<div my-directive change-my-age="changeAge()"></div>,注意,属性的名字要用-将多个个单词连接。

      注意:在新创建指令的作用域对象中,使用属性的名字进行绑定时,要使用驼峰命名标准,比如下面的代码。

下面来看一下程序中的代码:

angular.module(‘liveApp.directives‘, [
    ‘liveApp.constants‘,
    ‘liveApp.services‘
])
    .directive(‘bannersLiveRoom‘, function () {
        return{
            restrict:‘EA‘,
            link: function (scope, element, attrs) {
                scope.myInterval = 5000;
            },
            scope:{
                roomImages:"=roomImages" //传入的参数名,如果有大写,需要和指令的规则一样,有一个 “-”
            },
            templateUrl:"../components/bannersLiveRoomTemp.html"
        }
    })
    .directive(‘navigationBar‘, function () {
        return{
            restrict:‘EA‘,
            link: function (scope,element,attrs) {
                scope.menuArray=[]; //暂时用假数据,以后用外部传入的数据。
               switch (scope.barType){
                   case‘main‘:
                       scope.menuArray.push({menu:‘全部直播‘,sref:‘.index_1‘});
                       scope.menuArray.push({menu:‘英雄联盟‘,sref:‘.index_2‘});
                       scope.menuArray.push({menu:‘主机游戏‘,sref:‘.index_3‘});
                       scope.menuArray.push({menu:‘反恐精英‘,sref:‘.index_4‘});
                       break;
                   case‘divertingmain‘:
                      scope.menuArray.push({menu:‘全部直播‘,sref:‘.index_1‘});
                      scope.menuArray.push({menu:‘颜值‘,sref:‘.index_2‘});
                      scope.menuArray.push({menu:‘舞蹈‘,sref:‘.index_3‘});
                      scope.menuArray.push({menu:‘脱口秀‘,sref:‘.index_4‘});
                       break;
               }
            },
            scope:{
                barType:‘@barType‘
            },
            templateUrl:"../components/navigationBarTemp.html"
        }
    })
    //直播间列表
    .directive(‘liveRooms‘, function ($location,imgurl,userService,liveRoomService) {
        return{
            restrict:‘EA‘,
            link: function (scope, element, attrs) {
                scope.imgurl=imgurl;
                scope.comeroom= function (roomid) {
                    if(scope.roomType=="1"){
                        $location.path(‘/liveroom/‘+roomid);
                    }
                    else{
                        $location.path(‘/myliveroom/‘+roomid);
                    }
                }
            },
            scope:{
                roomTitle:"@roomTitle",
                roomList:"=roomList",
                roomType:‘@roomType‘
            },
            templateUrl:"../components/liveRoomsTemp.html"
        }
    })
    .directive(‘ngThumb‘, [‘$window‘, function($window) {
        var helper = {
            support: !!($window.FileReader && $window.CanvasRenderingContext2D),
            isFile: function(item) {
                return angular.isObject(item) && item instanceof $window.File;
            },
            isImage: function(file) {
                var type =  ‘|‘ + file.type.slice(file.type.lastIndexOf(‘/‘) + 1) + ‘|‘;
                return ‘|jpg|png|jpeg|bmp|gif|‘.indexOf(type) !== -1;
            }
        };

        return {
            restrict: ‘A‘,
            template: ‘<canvas/>‘,
            link: function(scope, element, attributes) {
                if (!helper.support) return;

                var params = scope.$eval(attributes.ngThumb);

                if (!helper.isFile(params.file)) return;
                if (!helper.isImage(params.file)) return;

                var canvas = element.find(‘canvas‘);
                var reader = new FileReader();

                reader.onload = onl oadFile;
                reader.readAsDataURL(params.file);

                function onl oadFile(event) {
                    var img = new Image();
                    img.onload = onl oadImage;
                    img.src = event.target.result;
                }

                function onl oadImage() {
                    var width = params.width || this.width / this.height * params.height;
                    var height = params.height || this.height / this.width * params.width;
                    canvas.attr({ width: width, height: height });
                    canvas[0].getContext(‘2d‘).drawImage(this, 0, 0, width, height);
                }
            }
        };
    }])

 

AngularJS-directive.js 基本指令