1. 定义directive
var myModule = angular.module("HelloAngular", []);
myModule.directive("hello", function(){
return {
restrict:’AEMC’,//匹配模式
template:’<div></div>’,//模板
replace:true
}
});
restrict:匹配模式
E:元素 <my-menu title=products></my-menu>
<span style="white-space:pre"> </span>A:属性(默认)<div my-menu=Products></div>
C:样式 <div class=my-menu:products></div>
M:注释 <!—directive:my-menu products -->
推荐使用元素和属的方式使用指令
当需要创建带有自己的模板的指令时,使用元素名称的方式创建指令
当需要为已经有的html标签增加功能时使用属性的方式创建指令
template:模板:
这是最终要替换的内容,可以将内容直接写在里面,或者写文件名,比如:templateUrl:’hello.html’
replace:替换操作
如果在<hello><div>aa</div></hello>自定义指令中有嵌套的,则可以使用下面的替换:
myModule.directive("hello", function(){
return {
restrict:’AEMC’,//匹配模式
transclude:true
template:
’<div>hello
<div ng-transclude></div>
</div>’
}
});
把嵌套的内容放在ng-transclude的位置
2. templateCache:模板缓存
var myModule = angular.module("HelloAngular", []);
myModule.run(function($templateCache){
$templateCache.put(“hello.html”, “<div>hello</div>”)
})
run方法:当所有模块加载完毕,这个方法会被执行一次
缓存完毕后,使用时,在
template: $templateCache.get(“hello.html”),//模板
3. 指令调用控制器方法
var myModule = angular.module("HelloAngular", []);
myModule.directive("hello", function(){
return {
restrict:’AEMC’,//匹配模式
template:’<div></div>’,//模板
replace:true
link:function(scope, element, attr){
element.bing(‘mouseenter’, function(event){
scope.$apply(attrs.how);
});
}
}
});
使用:
<hello how=”loadData()”></hello>
loadData方法要在controller中写
4. 指令之间的交互
4.1 先定义一个superman指令
var myModule = angular.module("HelloAngular", []);
myModule.directive("superman", function() {
return {
scope: {},
restrict: 'AE',
controller: function($scope) {
$scope.abilities = [];
this.addStrength = function() {
$scope.abilities.push("strength");
};
},
link: function(scope, element, attrs) {
element.addClass('btn btn-primary');
element.bind("mouseenter", function() {
console.log(scope.abilities);
});
}
}
});
controller可以暴露方法给外部调用
link用于处理指令内部的一些逻辑
4.2 定义一个strength指令
myModule.directive("strength", function() {
return {
require: '^superman',
link: function(scope, element, attrs, supermanCtrl) {
supermanCtrl.addStrength();//自动注入的参数
}
}
});
4.3 使用
<div class="row">
<div class="col-md-3">
<superman strength>动感超人---力量</superman>
</div>
</div>
4.4 独立scope
4.4.1scope绑定策略:
@:把当前属性做为字符串传递,还可以绑定来自外层scope的值,在属性中插入{{}}即可=:与父scope中的属性进行双向绑定
&:传递一个来自父scope的函数,稍后调用
4.4.2 @方式
var myModule = angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope', function($scope){
$scope.ctrlFlavor="百威";
}])
myModule.directive("drink", function() {
return {
restrict:'AE',
scope:{
flavor:'@'
},
template:"<div>{{flavor}}</div>"
}
});
html:
<drink flavor="{{ctrlFlavor}}"></drink>
4.4.3 =方式
var myModule = angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope', function($scope){
$scope.ctrlFlavor="百威";
}])
myModule.directive("drink", function() {
return {
restrict:'AE',
scope:{
flavor:'='
},
template:'<input type="text" ng-model="flavor"/>'
}
});
使用:
Ctrl:
<input type="text" ng-model="ctrlFlavor">
Directive:
<drink flavor="ctrlFlavor"></drink>
4.4.4 &方式
var myModule = angular.module("MyModule", []);
myModule.controller('MyCtrl', ['$scope', function($scope){
$scope.sayHello=function(name){
alert("Hello "+name);
}
}])
myModule.directive("greeting", function() {
return {
restrict:'AE',
scope:{
greet:'&'
},
template:
'<input type="text" ng-model="userName" /><br/>'+
'<button class="btn btn-default" ng-click="greet({name:userName})">
Greeting
</button><br/>'
}
});
使用:
<greeting greet="sayHello(name)"></greeting>
4.5 compile与link的区别
4.1.1 compile函数的作用是对指令的模板进行转换
4.1.2 link的作用是在模板和视图之间建立关联包括在元素上注册事件监听
4.1.3 scope在链接阶段才会被绑定到元素上,因此compile阶段操作scope会报错,link可以操作scope
4.1.4 对于同一个指令的多个实例,compile只会执行一次,而link对于指令的每个实例都会执行一次
4.1.5 一般情况下,我们只要编写link函数就够了
4.1.6 请注意,如果你编写的自定义的compile函数,自定义的link函数无效,因为compile函数应该返回一个link函数供后续处理
4.6 一些指令
4.1.1 ng-model:绑定输入框的值到scope 变量中,<input>, <select>,<textarea>,元素支持该指令。
4.1.2 ng-minlength
4.1.3 ng-maxlength
4.1.4 ng-click 指令调用了 reset() 方法,且在点击按钮时调用。可以实现点击效果
4.1.5 ng-class给标签动态绑定一个或者多个class
4.1.5.1 scope变量绑定,如上例。(不推荐使用)
4.1.5.2 字符串数组形式。
<divng-class="{true: 'active', false: 'inactive'}[isActive]">
$scope.isActive =true;
4.1.5.3 对象key/value处理
<div ng-class{'selected': isSelected, 'car': isCar}">
4.1.6 ng-submint 用于在表单提交后执行指定函数
<form ng-submit="myFunc()">
4.1.7 ng-if根据表达式的值在DOM中生成或移除一个元素,表达式再次成为true时这个元素及其内部的子元素会被重新插入DOM,此时这些元素的状态会是它们的原始状态,而不是它们上次被移除时的状态。
4.1.8 ng-show/ng-hide用来控制dom元素的显示或隐藏, ng-show和ng-hide则可以保留dom元素上次修改后的状态。
4.1.9 ng-disabled 禁用标签
<inputng-disabled=”mForm.userName.$valid”>
<buttontype=”submit” ng-disabled=”mForm. $valid”>
</button>