angularJS中directive指令笔记

directive用来解决什么问题?

指令,可以简单理解为在DOM元素上运行的函数,指令可以扩展该DOM元素的功能。

我们可以封装公共指令,比如分页指令、自动补全指令等等。

1. 使Html更具语义化,不需要深入研究代码和逻辑即可知道页面的大致逻辑。
2. 抽象一个自定义组件,在其他地方进行重用。

myModule.directive('namespaceDirectiveName', function factory(injectables) {
   var directiveDefinitionObj = {
       restrict: "E", //ele, attr, class, m(comments), 或者任意组合。推荐用A,有比较好的跨浏览器兼容性。
       priority: 1, //number, 设置模板中相对于其他元素指令的执行顺序,默认为0.优先级最低
       template: "string", //内联模板,和url模板二选一。
       templateUrl: "url", //url模板。可预先缓存模板来减少http请求,提高性能。
       replace: true, //bool值,替换或者追加(默认)。
       transclude: true, //默认false 是否保留自定义标签的原始内容,在模板中通过ng-transclude指令,替换/追加内容?
        //是否需要将指令内部的元素(注意不是指令的模板)嵌入到模板。在ng-transclude位置。
       //会导致在控制器中无法正常监听数据模型的变化

       scope:true,
       //bool or {}空对象, 是否创建新作用域。创建隔离作用域,表示新作用域与父作用域隔离,可正常执行不受外部工作环境影响
       //意味指令有了一个自己的$scope对象。 这个对象只能在指令的方法或模板字符串使用。

       controller:function controllerConstructor($scope, $element, $attrs, $transclude) {
            //...为跨指令通信创建一个发布的API
       },
       require: "string", //字符串/数组。需要其他指令服务于这个指令来正确的发挥作用,并会作为link函数的第四个参数
       //前缀:?当前指令无控制器,会将null作为link第四个参数。^在上游指令链中查找控制器。
       // ?^ 组合两个前缀,可选择加载需要的指令并在父指令链中进行查找。不加前缀,又找不到控制器,就会抛出错误。
       link:function postLink(scope, iElement, iAttrs) {
           //...以编程的方式修改生成的DOM元素实例,添加事件监听,数据绑定。执行多次。从模板创建的视图实例获得元素和属性
       },
       compile:function compile(tElement, tAttrs, transclude) {
           //仅在编译阶段执行一次,处理模板自身的转换。在编译阶段,作用域还不存在。
           //为了提升效率,自定义标签的实例中需要修改的公共属性,在compile中处理
           return {
               pre: function preLink(scope, iElement, iAttrs, controller) {
                   //...
               },
               post:function postLink(scope, iElement, iAttrs, controller) {
                   //...
               }
           }
       }
   };
   return directiveDefinitionObj;
});

 IDE推荐webstorm, 因为它是一个继承了angularJS,有非常强大的代码补全功能。比如输入ngdc,

再回车或者tab键,获取以下这段代码,可以节省好多一个字一个字敲代码的时间,超赞有木有...

    directive('', function factory() {
        var directiveDefinitionObject = {
            
            compile
        :
        function compile(tElement, tAttrs, transclude) {
            
            return function (scope, element, attrs) {
            }
        }
    }
        ;
        return directiveDefinitionObject;
    })

 ngm: angular.module('', []);

ngrw:

$routeProvider.when('', {
        templateUrl: '',
        controller: ''
    });

ngro: $routeProvider.otherwise({redirectTo: ''});

ngrwr:

 $routeProvider.when('', {
        templateUrl: '',
        controller: '',
        resolve: {}
    });



原文地址:https://www.cnblogs.com/dodocie/p/6702643.html