angularjs·的使用:指令(3)

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-showng-hide则可以保留dom元素上次修改后的状态。

4.1.9       ng-disabled 禁用标签

<inputng-disabled=”mForm.userName.$valid”>

<buttontype=”submit” ng-disabled=”mForm. $valid”>

</button>



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值