学习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的指令编译过程 (编辑:应用网_阳江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |



