angularjs自定义指令通用属性详解
自定义指令属性
- restrict:指令在html中的应用形式(‘A’‘E’‘C’‘M’),分别指代attribute、element、class、comment,默认值是A
- scope:指令的作用范围,scope在指令中通过属性标签传递,每一个指令都有自己的作用域,并且比依赖于父级scope作用域。
- scope对象有name和type变量属性,用法如下:
- name:“@”(值传递,单向绑定):@符号表示变量是值传递,指令会检索从父级scope中传递而来的字符串的值,指令可以使用该值但是无法修改,属于只读数据;
- amount:“=”(引用,双向绑定):=表示变量是引用传递,指令检索主scope引用的值,值可以是任意类型的,包括复合对象和数组。指令可以更改父级scope中的值;
- save:“&”(表达式):&表示变量是父级scope中的表达式,允许指令实现比修改值更高的操作
- template:替代原始模块中标记的字符串,替换功能将替换所有旧元素为新值,template使用scope中定义的变量与replace相关,replace:说明是否替换原始标记中的值或是追加原始标记中的值,默认值是false,这时原始标记将保留;
- trasclude:说明自定义指令是否复制原始标记中的内容
- link:次属性非常重要很常用,主要负责操作DOM事件及注册事件监听器等;link方法的参数如下:
- scope:指令scope的引用,scope在初始化时是不被定义的,link方法会注册监听器监视值变化事件;
- element:包含指令的DOM元素的引用;一般用jquery方法来操作dom;
- controller:在嵌套指令的情况下使用,把子指令的引用提供给父指令,指令之间可以交互
- 注意,当调用link 方法时, 通过值传递(“@”)的scope 变量将不会被初始化,它们将会在指令的生命周期中另一个时间点进行初始化,如果你需要监听这个事件,可以使用scope.$watch 方法。
代码示例:
/创建指令模块 (或者检索现有模块)
var m = angular.module("myApp");
// 创建"my-dir"指令
myApp.directive("myDir", function() {
return {
restrict: "E", // 指令是一个元素 (并非属性)
scope: { // 设置指令对于的scope
name: "@", // name 值传递 (字符串,单向绑定)
amount: "=", // amount 引用传递(双向绑定)
save: "&" // 保存操作
},
template: // 替换HTML (使用scope中的变量)
"<div>" +
" {{name}}: <input ng-model='amount' />" +
" <button ng-click='save()'>Save</button>" +
"</div>",
replace: true, // 使用模板替换原始标记
transclude: false, // 不复制原始HTML内容
controller: [ "$scope", function ($scope) { … }],
link: function (scope, element, attrs, controller) {…}
}
});
几种方式实现的demo
控制器的数据向指令传递
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<script src="js/angular.js"></script>
<script src="js/index.js"></script>
<title>Document</title>
</head>
<body ng-controller="indexCtrl">
<div my-directive my-url="{{datas.url}}" my-name="{{datas.name}}"></div>
</body>
<!-- 控制器的数据向指令传递 -->
</html>
templateUrl
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<script src="js/angular.js"></script>
<script src="js/index.js"></script>
<title>Document</title>
</head>
<body ng-controller="indexCtrl">
<div my-directive my-url="{{datas.url}}" my-name="{{datas.name}}"></div>
<div my-directive1 my-url="{{datas.url}}" my-name="{{datas.name}}"></div>
<script type="text/ng-template" id="hello.html">
<p>名称:{{myUrl}}</p>
<p>路径:{{myName}}</p>
</script>
</body>
</html>
transclude参数实例
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<script src="js/angular.js"></script>
<script src="js/index.js"></script>
<title>Document</title>
</head>
<body ng-controller="indexCtrl">
<div my-directive my-url="{{datas.url}}" my-name="{{datas.name}}"></div>
<div my-directive1 my-url="{{datas.url}}" my-name="{{datas.name}}"></div>
<script type="text/ng-template" id="hello.html">
<p>名称:{{myUrl}}</p>
<p>路径:{{myName}}</p>
</script>
<div sidebox title="Links">
<ul>
<li>first link</li>
<li>second link</li>
</ul>
</div>
<div sidebox title="TagCloud">
<div class="tagcloud">
<a href="">Graphics</a>
<a href="">AngularJS</a>
<a href="">D3</a>
<a href="">Front-end</a>
<a href="">Startup</a>
</div>
</div>
</body>
</html>
controller参数实例
<!DOCTYPE html>
<html lang="en" ng-app="app">
<head>
<meta charset="UTF-8">
<script src="js/angular.js"></script>
<script src="js/index.js"></script>
<title>Document</title>
</head>
<body ng-controller="indexCtrl">
<div your-aa sex="{{datas.sex}}"></div>
</body>
</html>
公共的js代码
var myapp = angular.module("app",[]);
myapp.controller("indexCtrl",function($scope){
$scope.datas = {
url:'http://www.baidu.com',
name:'点我去百度',
sex:'女'
}
})
myapp.directive("myDirective",function(){
return{
restrict:'A',
scope:{
'myUrl':'@',
'myName':'@'
},
replace:true,
template:'<a href="{{myUrl}}">{{myName}}</a>',
link:function(){
}
}
})
myapp.directive("myDirective1",function(){
return{
restrict:'AE',
scope:{
'myUrl':'@',
'myName':'@'
},
replace:false,
templateUrl:'hello.html',
link:function(){
}
}
})
myapp.directive("sidebox",function(){
return{
restrict:'AE',
scope:{
title:'@'
},
transclude:true,
template:'<div class="sidebox">\
<div class="content">\
<h2 class="header">{{ title }}</h2>\
<span class="content" ng-transclude>\
</span>\
</div>\
</div>'
}
})
myapp.directive("yourAa",function(){
return{
restrict:'A',
scope:{
sex:'@'
},
controller:'someController'
}
})
myapp.controller("someController",function($scope,$element,$attrs,$transclude){
alert($scope.sex);
})