做用:规定Angular范围 建立多个ng-app时默认只执行第一个 可用模块合并解决 <body ng-app="app"> <div ng-controller="demo1" ng-click="demo1()"></div> <div ng-controller="demo2" ng-click="demo2()"></div> <script src="../bower_components/angular/angular.js"></script> <script type="text/javascript"> angular.module('app1', []).controller('demo1', ['$scope', function($scope){ console.log(11111); }]); angular.module('app2', []).controller('demo2', ['$scope', function($scope){ console.log(22222); }]); //模块合并 angular.module('app', ['app1', 'app2']); </script> </body>
/* http://www.angularjsapi.cn/#/ngRepeat $index number 循环的索引值 $first boolean 是否第一次循环 $middle boolean 是否第一次和最后一次循环之间的循环。 $last boolean 是否最后一次循环。 $even boolean 是否循环的次数$index为偶数。 $odd boolen 是否循环的次数$index为奇数 */ <body ng-app="app"> <ul ng-controller="demo1Controller"> <li ng-repeat="value in data"> <span>{{$first ? $index : ''}}</span> <span>{{value.id}}</span> <span>{{value.name}}</span> <span>{{value.age}}</span> </li> </ul> <script src="../bower_components/angular/angular.js"></script> <script type="text/javascript"> angular.module('app', []).controller('demo1Controller', ['$scope', function($scope){ $scope.data = []; for (var i = 10 - 1; i >= 0; i--) { var obj = { id: i, name: '名字是:' + i, age: '年龄是:' + i }; $scope.data.push(obj); } }]) </script> </body>
1 <!-- 2 track by 3 若是数组内元素有重复,使用track by解决 4 --> 5 <body ng-app="app"> 6 <ul ng-controller="appController"> 7 <li ng-repeat="value in data track by $index"> 8 <span>{{value}}</span> 9 </li> 10 </ul> 11 12 <script src="../node_modules/angular/angular.js"></script> 13 <script type="text/javascript"> 14 angular.module('app', []) 15 .controller('appController', ['$scope', function($scope){ 16 $scope.data = ['小李子', '小孙子', '小孙子']; 17 }]) 18 </script> 19 </body>
<!--一、若是表达式是一个字符串,字符串应该是一个或多个空格分隔的类名称。--> <!--二、若是表达式是数组,数组中的每一个元素应该是一个字符串,即一个或多个空格分隔的类名称。--> <!--三、若是表达式是一个对象,应用相应的类名称做为key 值为true或false。--> <!--四、若是特定类别已被设置,该指令将不会添加剧复类。--> <style type="text/css"> .red { color: red; } .green { color: green; } </style> </head> <body ng-app="app"> <!-- ng-class: 会根据当前设置对象的属性和属性值决定是否添加特定类名 --> <ul ng-controller="demo1Controller" > <li ng-repeat="value in data" ng-class="{red:$even,green:$odd}"> <span>{{value.id}}</span> <span>{{value.name}}</span> <span>{{value.age}}</span> </li> </ul> <script src="../bower_components/angular/angular.js"></script>
1 <style> 2 .red{ 3 background-color: red;} 4 5 .green{ 6 background-color: green;} 7 8 #box{ 9 height: 200px; 10 width: 200px;transition:background-color 1s ease; 11 } 12 </style> 13 </head> 14 <body ng-app> 15 <select ng-model="style"> 16 <option value="red">红色</option> 17 <option value="green">绿色</option> 18 </select> 19 20 <!-- <div id="box" ng-class="style"></div> --> 21 <div id="box" ng-class="{red:style=='red', green:style=='green'}"></div> 22 23 <script src="bower_components/angular/angular.js"></script> 24 </body>
将做用域(scope)中的值绑定到元素的innerHTML上javascript
ng-bind在绑定的值包含HTML时会转义,为了安全(跨站攻击)css
1 <!-- ng-bind --> 2 <div ng-app="app" ng-init="username='shit'"> 3 <span ng-bind="username"></span> 4 </div>
1 <!-- ng-bind-html --> 2 <div ng-app="app" ng-init="username='<p>shit<p>'"> 3 <!-- 4 在页面当中绑定一个不安全的值的话,必需要去引用ng官方提供的库,作安全校验 5 $sanitize : 安全检验模块 6 须要下载包 cnpm install angular-sanitize,并引用 7 --> 8 <span ng-bind-html="username"></span> 9 </div> 10 11 <script src="../node_modules/angular/angular.js"></script> 12 <script src="../node_modules/angular-sanitize/angular-sanitize.js"></script> 13 <script type="text/javascript"> 14 // 使用本身定义的模块才能够依赖别的包里面定义的模块 15 // ng默认模块没有依赖任何模块 16 angular.module('app', ['sanitize']) 17 </script>
<span ng-app ng-cloak>{{'222'}}</span>
1 <!-- 2 ng-show:是否显示 true false 3 ng-hide:是否隐藏 4 ng-if:是否存在 5 --> 6 <span ng-app ng-show="false">{{'222'}}</span>
1 <body ng-app> 2 <select ng-model="selected"> 3 <option value="1">1</option> 4 <option value="2">2</option> 5 <option value="3">3</option> 6 </select> 7 <div ng-switch="selected"> 8 <div ng-switch-when="1"> 9 <h1>1111</h1> 10 </div> 11 <div ng-switch-when="2"> 12 <h1>2222</h1> 13 </div> 14 <div ng-switch-when="3"> 15 <h1>3333</h1> 16 </div> 17 <div ng-switch-default> 18 <h1>0000</h1> 19 </div> 20 </div> 21 </body>
1 <body ng-app> 2 <p><input type="checkbox" ng-model="checked">全选</p> 3 <ul> 4 <li>选项1<input type="checkbox" ng-checked="checked"></li> 5 <li>选项2<input type="checkbox" ng-checked="checked"></li> 6 <li>选项3<input type="checkbox" ng-checked="checked"></li> 7 <li>选项4<input type="checkbox" ng-checked="checked"></li> 8 <li>选项5<input type="checkbox" ng-checked="checked"></li> 9 </ul> 10 </body>
<script> angular.module('app', []) //指令就是将html代码进行封装 .directive('custDirective', [function(){ // Runs during compile return { // 指令名 // name: '', // priority多个指令设置在同一个元素上的执行优先级, // 执行顺序从低至高:1>2>3.priority的值为正整数,好比priority: 1, // priority: 1, // 若是为true,同一个元素上的其余指令的优先级高于本指令 // terminal: true, // 指令默认能共享父 scope 中定义的属性 // 能够定义一个隔离的scope // @:只能绑定字符串,因此一些简单的继承父scope的属性使用@ // =:须要实现双向数据绑定的时候使用=,属性和父类的相等 // &: 提供一种方式执行一个表达式在父scope的上下文中,即便用于将父scope中的函数绑定在指令的scope中 // scope: {}, // {} = isolate, true = child, false/undefined = no change // controller: function($scope, $element, $attrs, $transclude) {}, // require: 'ngModel', // Array = multiple requires, ? = optional, ^ = check parent elements // 指定当前指令的类型 // E = 元素, <my-ment></my-menu> // A = 属性, <div my-ment></div> // C = 类, <div class=my-menu></div> // M = html中的注释<!-- directive: my-menu --> // <!-- 两边必定要留空格,否则什么都不会发生 --> //restrict: 'A', //模板字符串 template: '<div>我是指令的生成内容</div>', //导入一个html文件 //templateUrl: 'template/demo.html', //是否用模板替换当前元素 replace: true, // 是否使用ng-transculde来包含html中指令包含的原有的内容 // transclude: true, // compile: function(tElement, tAttrs, function transclude(function(scope, cloneLinkingFn){ return function linking(scope, elm, attrs){}})), link: function($scope, iElm, iAttrs, controller) { } }; }]); </script>
(1)先说@ app.controller("ctl1", function ($scope) { $scope.name = "hello world"; }).directive("testDirective", function () { return { scope: { name: "@" }, template: 'Say:{{name}} <br>改变隔离scope的name:<input type="buttom" value="" ng-model="name" class="ng-pristine ng-valid">' } }) <div ng-controller="ctl1"> <div> <div>父scope: <div>Say:{{name}}<br>改变父scope的name:<input type="text" value="" ng-model="name"/></div> </div> <div>隔离scope:这个显示为hello world <div test-directive name="{{name}}"></div> </div> <div>隔离scope(不使用{{name}}这个就直接显示为name了): <div test-directive name="name"></div> </div> </div> 咱们在test-directive指令所在的div上面,增长了一个name属性,要使用双花括号来给属性赋值。也能够写成nameCopy:'@nameForCtl',这样写,在给directive中的scope的属性赋值的时候,获取查询@后面的name这个标识对应的属性的值(这里nameForCtl在js中是驼峰写法,一样的在html中对应的属性名应该写成name-for-ctl)。不是很推荐这种写法,感受有点多余。
上一个例子中,咱们使用name="{{name}}"的形式来传递父scope 的属性对应的值,so,咱们只是把对应的值传递给了directive的scope,当我想实如今directive中改变父scope传递过来的值时,父scope中的值也对应的改变,显然用@这种方法走不通。html
app.controller("ctl1", function ($scope) { $scope.user = { name: 'hello', id: 1 }; }).directive("testDirective", function () { return { scope: { user: "=" }, template: 'Say:{{user.name}} <br>改变隔离scope的name:<input type="buttom" value="" ng-model="user.name"/>' } }) <div ng-controller="ctl1"> <div>父scope: <div>Say:{{user.name}}<br>改变父scope的name:<input type="text" value="" ng-model="user.name"/></div> </div> <div>隔离scope: <div isolated-directive user="user"></div> </div> <div>隔离scope(使用{{name}},这个会报错): <div isolated-directive user="{{user}}"></div> </div> </div>
这一个例子和上一个例子不一样的地方就是属性赋值的时候,一个应该使用{{}},一个不应使用。=为了实现双向数据绑定,angular会使用‘=’对应的属性的值与父scope中的属性进行匹配,而后传递给diractive中的scope。至于实现的细节和原理,这里我就不说了(实际上是不大清楚)。java
(3)&node
& 方式提供一种途经使directive 能在父 scope 的上下文中执行一个表达式。此表达式能够是一个 function。其实说白了,就是可使用在父scope中定义的函数。angularjs
好比:当你写了一个 directive,当用户点击按钮时,directive 想要通知 controller,controller 没法知道 directive 中发生了什么,也许你能够经过使用 angular 中的 event 广播来作到,可是必需要在 controller 中增长一个事件监听方法。
最好的方法就是让 directive 能够经过一个父 scope 中的 function,当 directive 中有什么动做须要更新到父 scope 中的时候,能够在父 scope 上下文中执行一段代码或者一个函数。npm
app.controller("ctl1", function ($scope) { $scope.value = "hello world"; $scope.click = function () { $scope.value = Math.random(); }; }).directive("testDirective", function () { return { scope: { action: "&" }, template: '<input type="button" value="在directive中执行父scope定义的方法" ng-click="action()"/>' } }) <div ng-controller="ctl1"> <div>父scope: <div>Say:{{value}}</div> </div> <div>隔离scope: <div isolated-directive action="click()"></div> </div> </div>
在上面的例子中,咱们的属性action赋值为一个方法:action="click()"。api
1 <body ng-app="app"> 2 3 <!-- 4 将true或false传入到过滤器来肯定checkmark显示什么 5 可传递多参数 :的形式 6 --> 7 <h1>{{true | checkmark : 1}}</h1> 8 9 <script> 10 angular.module('app', []) 11 .filter('checkmark', function() { 12 13 //过滤器执行的函数 14 return function(input, type){ 15 16 console.log(type); 17 18 //input 传递进来的参数true或false、 19 // return input ? '\u2713' : '\u2718'; 20 if (type == 1) { 21 return '\u2713'; 22 }else { 23 return '\u2718'; 24 } 25 } 26 }); 27 </script>