Angular(2)
来源:互联网 发布:阿里云ecs使用教程 编辑:程序博客网 时间:2024/06/07 20:02
1.控制器中的$scope为什么不能改成其他的名字
- angular是根据形参的名字去传递实参
2.安全的方式创建控制器
3.原理:如何根据形参的名字传递参数
3.Angular常用指令
- 指令分类:内置指令(普通指令、事件指令) 自定义指令
普通指令
ng-repeat 遍历数据
<body ng-app="myApp" ng-controller="demoCtrl"> <h4>遍历 一维数组</h4> <ul> <!-- ng-repeat 遍历数据 类似于for in 循环 in 是固定写法 in 后面加上要遍历的数据 item 是遍历的当前项(item这个词可以随意写) 这个指令可以加在任何标签上 --> <li ng-repeat="item in data"> {{item}} </li> </ul> <hr /> <h4>遍历 数组中混合对象</h4> <p ng-repeat="item in person">{{item.name}} {{item.age}}</p> <hr /> <h4>遍历 对象</h4> <!-- key代表对象的键值 val代表对象键值对应的值 --> <div ng-repeat="(key,val) in obj"> {{key}} {{val}} </div> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ // 一维数组 $scope.data = ['小明','小红','小黑','小琴']; // 数组中混合对象(最常用的形式) $scope.person = [ {name:'小明',age:18}, {name:'小红',age:28}, {name:'小红',age:28}, {name:'小黑',age:38}, {name:'小琴',age:48} ] // 对象 $scope.obj = { name:'小明', age:35, hobby : '吃饭' } }]) </script></body>
ng-repeat 补充
<body ng-app="myApp" ng-controller="demoCtrl"> <!-- 在遍历的过程中 $index : 遍历过程中的索引 $first : 布尔类型的值 当前是否是第一项 是返回true 不是返回false $last : 布尔类型的值 当前是否是最后一项 是返回true 不是返回false $middle : 布尔类型的值 第一项和最后一项返回false 其余返回true $even : 偶数项返回true 否则返回false $odd : 奇数项返回true 否则返回false 我们可以利用这些值在循环的过程中做各种判断 达到我们想要的目的 --> <ul> <li ng-repeat="item in person" class="{{$first ? 'first' : ''}} {{ $last ? 'last' : ''}}"> <p>名字:{{item.name}}</p> <p>年龄:{{item.age}}</p> <p>索引:{{$index}}</p> <p>是否是第一项:{{$first}}</p> <p>是否是最后一项:{{$last}}</p> <p>是否是中间项:{{$middle}}</p> <p>是否偶数项:{{$even}}</p> <p>是否奇数项:{{$odd}}</p> </li> </ul> <!-- 默认情况下遍历的数组中不能有重复类型的值(基本数据类型) 否则会报错 信息如下 [ngRepeat:dupes] ng-repeat指令被愚弄(调戏)了 解决: 在遍历的数据后面写上track by 一个唯一(不重复)的值 一般会写$index --> <hr /> <div ng-repeat="item in data track by $index"> {{item}} </div> <hr /> <div ng-repeat="(key,val) in data track by key"> {{val}} </div> <hr /> <!-- 通过奇偶数做隔行变色 --> <style> .even{background:pink;} .odd{background:lightblue;} </style> <ul> <li ng-repeat="item in person" class="{{$even ? 'even' : 'odd'}}"> <p>名字:{{item.name}}</p> <p>年龄:{{item.age}}</p> <p>索引:{{$index}}</p> <p>是否是第一项:{{$first}}</p> <p>是否是最后一项:{{$last}}</p> <p>是否是中间项:{{$middle}}</p> <p>是否偶数项:{{$even}}</p> <p>是否奇数项:{{$odd}}</p> </li> </ul> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ $scope.person = [ {name:'小明',age:18}, {name:'小红',age:28}, {name:'小红',age:28}, {name:'小黑',age:38}, {name:'小琴',age:48} ] // 数组中存在重复的值 $scope.data = ['小明','小红','小明','小红']; }]) </script></body>
在循环的过程中如果有重复项 需要加上 track by $index
ng-class指令 用来操作类名
<body ng-app="myApp" ng-controller="demoCtrl"> <style> button { width: 120px; height: 40px; border: none; outline: none; color: #FFF; font-size: 16px; } .red { background: red; } .green { background: green; } </style> <!-- ng-class指令:专门用来操作类名的 1.指令的值以对象的形式存在 2.对象的属性值转化为布尔值是true时,将当前的属性名作为类名添加到class属性中 3.对象的属性值转化为布尔值是false时,将当前的属性名从class属性中删除掉 4.属性值可以是数据模型,也可以是JS表达式 注意:angular不推崇DOM操作,在当前例子中并没有直接操作类名的JS语句, 而是通过数据模型isGreen的值是true还是false来确定添加哪个颜色的类名, 至于如何添加到class属性中,由angular替我们完成。 --> <button ng-class="{'green':isGreen,'red':!isGreen}" ng-click="setColor()">按钮</button> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp', []) .controller('demoCtrl', ['$scope', function($scope) { // isGreen用来控制当前按钮是绿色还是非绿色 $scope.isGreen = true; // 用来切换按钮的颜色 $scope.setColor = function(){ // 让isGreen在每次点击按钮的时候跟当前值取反 // 也就是一次是true 一次是false // 以达到切换颜色的目的 $scope.isGreen = !$scope.isGreen; } }]) </script></body>
ng-bind ng-bind-template ng-cloak 数据绑定 解决表达式闪烁问题
<body ng-app="myApp" ng-controller="demoCtrl"> <!-- 在angular没有被加载进页面之前,浏览器会将下面的 表达式当作普通字符串显示在页面中,angular在被加 载进页面之后,才会将下面的表达式替换成了对应的数 据,这样就会存在闪烁问题 --> {{msg1}} <!-- 用指令ng-bind绑定数据解决这个问题 ng-bind指定是专门用来做数据绑定的 --> <div ng-bind="msg1"></div> <!-- 除此之外,还有一个指令ng-cloak,也可以解决表达式闪烁的问题 angular会隐藏有ng-cloak指令或样式的元素,在做完解析之后又会 移除元素身上的ng-cloak样式和指令,从而解决表达式闪烁的问题 但是!angular在页面的最后才被引用进来,所以不能很好的解决这 个问题需要我们手动在页面顶部加上隐藏元素的样式 --> <style> .ng-cloak,[ng-cloak]{display:none;} </style> <div class="ng-cloak"> {{msg2}} </div> <div ng-cloak> {{msg2}} </div> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ $scope.msg1 = '指令ng-bind解决表达式闪烁问题'; $scope.msg2 = '指令ng-cloak解决表达式闪烁问题'; }]) </script></body>
ng-non-bindable 不解析表达式
ng-show、ng-hide 通过样式的方式控制元素显示隐藏
<body ng-app="myApp" ng-controller="demoCtrl"> <!-- ng-show :控制元素显示隐藏(通样式的方式) 当值为true时 元素显示 当值为false时 元素隐藏 ng-hide :控制元素显示隐藏(通样式的方式) 当值为true时 元素隐藏 当值为false时 元素显示 --> <h3>例子1 当没有数据的时候显示 '暂无数据'</h3> <ul> <li ng-repeat="data in list"> <span>{{data.id}}</span> <a href="#">{{data.title}}</a> <div> {{data.description}} </div> </li> </ul> <!-- 当没有数据的时候显示 "暂无数据" 可以通过ng-show指令 如果存放数据的数组长度为0 也就是没有数据 表达式返回true 当前div显示 如果存放数据的数组不为0 表达式返回false 当前div隐藏 也可以用ng-hide="list.length" 达到相同效果(自行思考) --> <div ng-show="list.length == 0">暂无数据</div> <a href="javascript:;" ng-click="resetData()">清空数据</a> <hr /> <h3 ng-init="isToggle=true">例子2 选项卡切换</h3> <button ng-click="isToggle=true">显示1</button> <button ng-click="isToggle=false">显示2</button> <div ng-show="isToggle">1</div> <div ng-show="!isToggle">2</div> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ $scope.list = [ { id:'1', title:'有人在微信QQ上拉你搞投资?那都是骗子!', description : '喜欢炒股的朋友或许经常在微信或者QQ收到各种“业务员”的推广,有的介绍老师给你,有的介绍私募给你,有的是亲自操刀上阵,通常情况下是在操作获利之后五五分成,在操作一段时间之后,“业务员”会告诉你最近股市不好做,不好赚钱,而“我们有新的业务”,可以快速地获得利润,再给你发一些高收益的截图。' }, { id:'2', title:'女子被"男友"骗150万 相处3年不知对方系闺蜜假扮', description : '时报讯 今年2月,杭州市滨江警方接到一起报警,报警人林芬(化名)称2014年至2017年间,自己被男友高鹏(化名)骗了共计150多万元。近日,民警抓获了该案嫌疑人,一看,这高鹏啊,不仅是个女的,还是林芬的闺蜜。' } ] // 删除数据方法 $scope.resetData = function(){ // 快速清空数组 $scope.list.length = 0; // 也可以将数组重新复制为空数组 // $scope.list = []; } }]) </script></body>
ng-if 控制元素显示隐藏
- 和ng-show用法相同
- 区别是ng-if是通过DOM节点的添加和删除使得元素显示和隐藏
ng-switch、ng-switch-when
<!-- ng-switch ng-switch-when 是一对指令类 似于JS中 switch case 语句 匹配到哪项 哪项就显示 其他项就隐藏 常用于 做多个选项卡的显示和隐藏--><body ng-app ng-init="showNum=1"> <div ng-switch="showNum"> <button ng-click="showNum=1">显示1</button> <button ng-click="showNum=2">显示2</button> <button ng-click="showNum=3">显示3</button> <div ng-switch-when="1">1</div> <div ng-switch-when="2">2</div> <div ng-switch-when="3">3</div> </div> <script src="node_modules/angular/angular.min.js"></script></body>
ng-options 生成select下拉列表 需要配合ng-model指令使用 否则报错
<body ng-app="myApp" ng-controller="demoCtrl"> <!-- ng-options :生成下拉框列表 需要和ng-model指令配合使用 ball in balls 类似于ng-repeat balls 是要进行循环的数据 in 固定写法 ball 是每次循环的当前项 ball.name for for 固定写法 ball.name 将要显示在option标签内的值 ball.value as as 固定写法 ball.value 将要显示在option标签value属性中的值 --> <select ng-model="likeBall" ng-options="item.value as item.name for item in balls"></select> {{likeBall}} <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ // 给下拉列表设置默认值 和options标签value属性的值对应 $scope.likeBall = "001"; // 下拉列表的数据源 $scope.balls = [ { name:'足球', value:'001' }, { name:'篮球', value:'002' }, { name:'橄榄球', value:'003' }, { name:'排球', value:'004' }, { name:'乒乓球', value:'005' } ]; }]) </script></body>
事件指令
- ng-click
- ng-dblclick
- ng-blur
- ng-focus
- ng-change
- 其他指令
- ng-href
- ng-src
- ng-value
4.练习:在点击提交按钮后将选中项找出来
<body ng-app="myApp" ng-controller="demoCtrl"> <h3>在点击提交按钮后将选中项找出来</h3> <label ng-repeat="data in balls"> <input type="checkbox" value="{{data.name}}" ng-model="data.isChecked"/>{{data.name}} </label> <br/><br/> <button ng-click="submitData()">提交</button> <br/><br/> 选中的结果: <ul> <li ng-repeat="data in result">{{data.name}}</li> </ul> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp',[]) .controller('demoCtrl',['$scope',function($scope){ $scope.balls = [ { name:'足球', isChecked : false }, { name:'篮球', isChecked : false }, { name:'橄榄球', isChecked : false }, { name:'排球', isChecked : false }, { name:'乒乓球', isChecked : false } ]; $scope.result = []; $scope.submitData = function(){ $scope.result = []; for(var i=0;i<$scope.balls.length;i++){ if($scope.balls[i].isChecked){ $scope.result.push($scope.balls[i]) } } } }]) </script></body>
5.面向对象的方式创建控制器
<body ng-app="myApp" ng-controller="demoCtrl as hello"> <p>{{hello.name}}</p> <p>{{age}}</p> <script src="node_modules/angular/angular.min.js"></script> <script> angular.module('myApp', []) /* 1.angular内部会帮我们new控制器处理函数 2.demoCtrl as hello 这个hello就是new出来的对象 3.在视图中我们就可以使用hello.属性的方式取到hello对象中的值 4.面向对象的方式和$scope可以同时使用 */ .controller('demoCtrl', ['$scope', function($scope) { this.name = '我是孙悟空'; $scope.age = '我今年500岁'; }]) </script></body>
6.MVC MVVM介绍
- 【MVC】思想源于后端
- M model 模型 数据和数据相关的方法(直接操作数据库的方法)
- V view 视图 用户界面
- C controller 控制器 网站的业务逻辑都写在控制器里面
- 对代码进行分类,便于管理
- MVC思想并不完全适用于前端
MVC里面的控制器做的事情太多了 代码又变得冗余
【MVVM】思想
- 它并不是一个全新的思想 是对MVC思想的改进 升级
- M model 模型 数据和数据相关的方法 ajax请求
- V view 视图 用户界面
- VM 它都是跟数据双向绑定有关系 $scope
- angular就是基于MVVM这样的一个前端框架
7.AngularJS Batarang Chrome开发调试工具
8.拜拜了 浮动
阅读全文
0 0
- Angular(2)
- Angular学习(2)Directives
- angular学习笔记(2)
- Angular学习笔记(2)
- 约战Angular中Promise(2)
- angular.js学习(2)--filter
- Angular 2 中的组件(一)
- Angular 2 中的组件(二)
- Angular 2 原生国际化支持(一)
- TypeScript: Angular 2 的秘密武器(译)
- Angular 2 原生国际化支持(二)
- Angular快速入门2 ---控制器(controller)
- 揭秘Angular 2(一):TypeScript入门
- angular.js模态框拖动(2)
- angular的hero例子(2)
- Angular 2的12个经典面试问题汇总(文末附带Angular测试)
- Angular 2的12个经典面试问题汇总(文末附带Angular测试)
- Angular 2的12个经典面试问题汇总(文末附带Angular测试)
- linux内存文件系统
- 在macbook上安装最新版的gcc
- 在c#中 RemoveAt、 Remove、delete用法区别
- NIO浅显易懂的入门
- javabean的简单实现
- Angular(2)
- Robomasters大神符模拟程序
- linux文件的时间
- com.google.protobuf.ServiceException: java.lang.NoClassDefFoundError: com/yammer/metrics/core/Gauge
- 《请回答1994》观后有感
- css控制文字模糊
- Android hwcomposer模块接口
- android studio快捷键(Eclipse模式下的,android studio模式不知道通用否)
- equals方法和tostring方法重写《从我的微博上转载过来的,创建时间为2015-07-10》