指令就是一些附加在HTML元素上的自定义标记(例如:属性,元素,或css类),它告诉AngularJS的HTML编译器 ($compile) 在元素上附加某些指定的行为,甚至操作DOM、改变DOM元素,以及它的各级子节点
‘AE’ - 既匹配属性名又匹配元素名
E 作为元素名使用
A 作为属性使用
C 作为类名使用
M 作为注释使用
(数字),可选参数,指明指令的优先级,若在单个DOM上有多个指令,则优先级高的先执行
(布尔型),可选参数,可以被设置为true或false,若设置为true,则优先级低于此指令的其他指令则无效,不会被调用(优先级相同的还是会执行)
(布尔值),默认值为false,设置为true时候,我们再来看看下面的例子(对比下在template时候举的例子)
(1)默认值false。表示继承父作用域;
(2)true。表示继承父作用域,并创建自己的作用域(子作用域);
(3){}。表示创建一个全新的隔离作用域;
<html lang="zh" ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS入门学习title>
<script src="../public/js/angular.min.js">script>
head>
<body>
<div ng-controller="MainController">
父亲:{{name}}
<input ng-model="name" />
<div my-directive>div>
div>
body>
<script type="text/javascript">
var app = angular.module('myApp', [])
app.controller('MainController', function ($scope) {
$scope.name = '林炳文'
})
app.directive('myDirective', function () {
return {
restrict: 'EA',
scope: true,
// scope: false,
// scope: {},
template: '儿子:{{ name }}',
}
})
script>
html>
子组件不会影响父组件
<html ng-app="myApp">
<head>
<script src="../public/js/angular.min.js">script>
<style>
div.spicy div {
padding: 10px;
border: solid 2px blue;
}
style>
head>
<body>
<div ng-controller="myController">
<div class="result">
<div>父scope:
<div>Say:{{name}}<br>改变父scope的name:<input type="text" value="" ng-model="name" />div>
div>
<div>隔离scope:
<div isolated-directive name="{{name}}">div>
div>
<div>隔离scope(不使用父scope {{name}}):
<div isolated-directive name="name">div>
div>
div>
body>
<script type="text/javascript">
var app = angular.module('myApp', []);
app.controller("myController", function ($scope) {
$scope.name = "hello world";
}).directive("isolatedDirective", function () {
return {
scope: {
name: "@"
},
template: 'Say:{{name}}
改变隔离scope的name:'
};
});
script>
html>
长用于方法调用
<html ng-app="myApp">
<head>
<script src="../public/js/angular.min.js">script>
<style>
div.spicy div {
padding: 10px;
border: solid 2px blue;
}
style>
head>
<body>
<div ng-controller="myController">
<div>
父scope:
<div>Say:{{value}}div>
div>
<div>
隔离scope:
<div isolated-directive action="click()">div>
div>
div>
body>
<script type="text/javascript">
var app = angular.module('myApp', [])
app
.controller('myController', function ($scope) {
$scope.value = 'hello world'
$scope.click = function () {
$scope.value = Math.random()
}
})
.directive('isolatedDirective', function () {
return {
scope: {
action: '&',
},
template: '',
}
})
script>
html>
父子组件会相互影响
<html ng-app="myApp">
<head>
<script src="../public/js/angular.min.js">script>
<style>
div.spicy div {
padding: 10px;
border: solid 2px blue;
}
style>
head>
<body>
<div ng-controller="myController">
<div>
父scope:
<div>
Say:{{user.name}}
<br />
改变父scope的name:
<input type="text" value="" ng-model="userBase.name" />
div>
div>
<div>
隔离scope:
<div isolated-directive user="userBase">div>
div>
div>
body>
<script type="text/javascript">
var app = angular.module('myApp', [])
app
.controller('myController', function ($scope) {
$scope.userBase = {
name: 'hello',
id: 1,
}
})
.directive('isolatedDirective', function () {
return {
scope: {
user: '=',
},
template: 'Say:{{user.name}}
改变隔离scope的name:',
}
})
script>
html>
应用场景: B 指令一定要依赖A 指令
<html lang="zh" ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS入门学习title>
<script src="../public/js/angular.min.js">script>
head>
<body>
<outer-directive>
<inner-directive>inner-directive>
<inner-directive2>inner-directive2>
outer-directive>
<script>
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',
template: '{{message}}',
link: function (scope, elem, attrs, controllerInstance) {
scope.message = 'Hi,leifeng'
controllerInstance.say(scope)
scope.sayAction = function () {
controllerInstance.say(scope)
}
},
}
})
app.directive('innerDirective2', function () {
return {
scope: {},
restrict: 'AE',
require: '^outerDirective',
template: '{{message}}',
link: function (scope, elem, attrs, controllerInstance) {
scope.message = 'Hi,shushu'
controllerInstance.say(scope)
scope.sayAction = function () {
controllerInstance.say(scope)
}
},
}
})
script>
body>
html>
如果不想让指令内部的内容被模板替换,可以设置这个值为true。
angular.module('myApp', []).directive('myDirective', function () {
return {
restrict: 'A', // 始终需要
controller: 'SomeController',
}
})
// 应用中其他的地方,可以是同一个文件或被index.html包含的另一个文件
angular.module('myApp').controller('SomeController', function ($scope, $element, $attrs, $transclude) {
// 控制器逻辑放在这里
})
参数
(1) s c o p e , 与 指 令 元 素 相 关 联 的 作 用 域 ( 2 ) scope,与指令元素相关联的作用域 (2) scope,与指令元素相关联的作用域(2)element,当前指令对应的 元素
(3) a t t r s , 由 当 前 元 素 的 属 性 组 成 的 对 象 ( 4 ) attrs,由当前元素的属性组成的对象 (4) attrs,由当前元素的属性组成的对象(4)transclude,嵌入链接函数,实际被执行用来克隆元素和操作DOM的函数
angular.module('myApp', []).directive('myDirective', function () {
return {
restrict: 'A',
controller: function ($scope, $element, $attrs, $transclude) {
// 控制器逻辑放在这里
},
}
})
链接函数负责注册DOM事件和更新DOM
function link(scope, iElement, iAttrs, controller) { ... }