学习AngularJs:Directive指令用法(完整版)
注意: 除非是用来定义一些可复用的行为,一般不推荐在这使用。 lt;!DOCTYPE htmlgt; lt;html lang="zh" ng-app="myApp"gt; lt;headgt; lt;meta charset="UTF-8"gt; lt;titlegt;AngularJS入门学习lt;/titlegt; lt;script type="text/javascript" src="./1.5.3/angular.min.js"gt;lt;/scriptgt; lt;/headgt; lt;hello mycolor ="red"gt;我是林炳文~~~lt;/hellogt; lt;/bodygt; lt;script type="text/javascript"gt; var app = angular.module('myApp', []); app.directive('hello', function() { return { restrict: 'EA', transclude: true, //注意此处必须设置为true controller: function ($scope, $element,$attrs,$transclude,$log) { //在这里你可以注入你想注入的服务 $transclude(function (clone) { var a = angular.element('lt;pgt;'); a.css('color', $attrs.mycolor); a.text(clone.text()); $element.append(a); }); $log.info("hello everyone"); } }; }); lt;/scriptgt; lt;/htmlgt; 输出结果:
并且在控制台下输出hello everyone 让我们看看$transclude();在这里,它可以接收两个参数,第一个是$scope,作用域,第二个是带有参数clone的回调函数。而这个clone实际上就是嵌入的内容(经过jquery包装),可以在它上做很多DOM操作。 它还有最简单的用法就是 lt;scriptgt; 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); } }; }); lt;/scriptgt; 注意:使用$transclude会生成一个新的作用域。 但是如果我们实用$transclude($scope,function(clone){}),那么作用域就是directive的作用域了 那么问题又来了。如果我们想实用父作用域呢 可以使用$scope.$parent 同理想要一个新的作用域也可以使用$scope.$parent.new(); 一般以前我们经常用这样方式来写代码: angular.module("app",[]) .controller("demoController",["$scope",function($scope){ $scope.title = "angualr"; }]) lt;div ng-app="app" ng-controller="demoController"gt; {{title}} lt;/divgt; 后来angularjs1.2给我们带来新语法糖,所以我们可以这样写 angular.module("app",[]) .controller("demoController",[function(){ this.title = "angualr"; }]) lt;div ng-app="app" ng-controller="demoController as demo"gt; {{demo.title}} lt;/divgt; 同样的我们也可以再指令里面也这样写 lt;scriptgt; angular.module('myApp',[]).directive('mySite', function () { return { restrict: 'EA', transclude: true, controller:'someController', controllerAs:'mainController' //..其他配置 }; }); lt;/scriptgt; 11.require(字符串或者数组) 最后通过link链接函数的第四个参数就可以引用这些重合的方法了。 lt;!doctype htmlgt; lt;html ng-app="myApp"gt; lt;headgt; lt;script src="http://cdn.staticfile.org/angular.js/1.2.10/angular.min.js"gt;lt;/scriptgt; lt;/headgt; lt;bodygt; lt;outer-directivegt; lt;inner-directivegt;lt;/inner-directivegt; lt;inner-directive2gt;lt;/inner-directive2gt; lt;/outer-directivegt; lt;scriptgt; var app = angular.module('myApp', []); app.directive('outerDirective', function() { return { scope: {}, restrict: 'AE', controller: function($scope) { 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('innerDirective2', function() { return { scope: {}, restrict: 'AE', require: '^outerDirective', link: function(scope, elem, attrs, controllerInstance) { scope.message = "Hi,shushu"; controllerInstance.say(scope); } }; }); lt;/scriptgt; lt;/bodygt; lt;/htmlgt; 上面例子中的指令innerDirective和指令innerDirective2复用了定义在指令outerDirective的controller中的方法 也进一步说明了,指令中的controller是用来让不同指令间通信用的。 另外我们可以在require的参数值加上下面的某个前缀,这会改变查找控制器的行为: (1)没有前缀,指令会在自身提供的控制器中进行查找,如果找不到任何控制器,则会抛出一个error (2)?如果在当前的指令没有找到所需的控制器,则会将null传给link连接函数的第四个参数 (3)^如果在当前的指令没有找到所需的控制器,则会查找父元素的控制器 (4)#63;^组合 12.Anguar的指令编译过程 (编辑:成都站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |