[关闭]
@king- 2017-02-07T22:42:58.000000Z 字数 7377 阅读 864

Angularjs学习

web前端开发 angularjs 梅斯前端文档 梅斯前端培训


一、 Angularjs 是什么?

AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等等。

重点词:MVC 模块化 双向数据绑定 语义化标签 依赖注入

二、构建第一个Angularjs应用

  1. + css
  2. + js
  3. | - app.js
  4. + images
  5. + lib
  6. | - + angularjs
  7. | - + jquery
  8. ...
  9. index.html

命令行工具:( grunt | gulp | webpack)+ Yeoman + bower

这样的构建目录合理情绪,并且对生产环境和开发环境的相关指令已经写的很完整了,不用重复写编译指令。同时也集成了开发中需要的测试工具(karma | jasmine

三、模版和数据绑定

Angularjs 之所以一下子进入人们的眼球,主要就是他的 双向数据绑定 ,这样的操作和思路刷新了前端工程师以往使用 jQueryDOM 反复操作的理解和认识,解放了双手,同时让 ViewModel 实现了真正的解藕。

  1. <input type="text" ng-model="name">
  2. <h1>Hello , {{name}}</h1>

模版和数据双向绑定 Demo

从上面的例子反过来看的话,如果我们通过 ajax 从服务器端得到了一串 json 数据的化,我们是不是只需要构建合理的 model 那么数据就自动填充到页面上了,从而避免了我们手动去操作 DOM 渲染数据。

  1. 思考如果一个 model name 为 nameOne 的指数据需要渲染到 name 为 nameTwo 的模型视图上怎么处理?

使用 $watch 监听 nameOne 的变化,从而去改变 nameTwo

  1. // $watch(watchFn, watchCallBack, deepWatch)
  2. // watchFn => 需要监听的modal,字符串形式
  3. // watchCallBack => 当监听内容发生改变时候会触发执行的方法
  4. // deepWatch => 如果为true,则见图对象下所有属性值
  5. $watch('nameOne',function(newValue, oldValue, scope){
  6. nameTwo = newValue;
  7. })
  1. 思考Angularjs的双向数据绑定是如何实现的,$watch 的原理是不是和双向数据绑定的形式很像?

angularjs 的双向数据绑定就是使用和 $watch 一样的脏数据处理机制实现的。这样的处理固然是好,但是也有一定的性能缺陷。

四、指令

指令名称 作用
ng-app 界定Angularjs的作用范围
ng-controller 设置范围内容控制器
ng-modal 定义Modal,只有定义了Modal才能执行双向数据绑定,不然就是单向的
ng-click 点击事件
ng-repeat 循环输出
... ...

当然这里还有很多 ng- 内部指令,详细的可以查看 API 文档

正常的DOM事件绑定的时候,我们是不推荐使用类似 Angularjs0级DOM 事件绑定的形式。但是在使用 Angularjs 的时候不需要考虑这些,这并不影响我们的操作,同时 Angularjs 的指令已经很好的帮我们解决了各个浏览器之间的差异性

  1. //自定义指令的基本格式
  2. app.directive('指令名称', function() {
  3. return {
  4. restrict: 'E',// 指令类型
  5. transclude:true,
  6. require:'^?abc',//这是重点,指令和指令之间的继承和通信就靠他了
  7. template: '<div>Hi there</div>',//指令模版
  8. replace: true, // 是否覆盖占位元素(针对E)
  9. compile:function(){},//指令编译过程执行
  10. link:function(){},//指令绑定数据过程执行
  11. controller:function(){},//指令自身的控制器
  12. };
  13. });
字母 声明风格 示列
E 元素 <指令名称>< /指令名称>
A 属性 < div 指令名称=“值可加可不加”>< /div >
C 样式 < div class=指令名称>
M 注释 < !--这个我没用过,真不要问我 -- >

E => Element => 如果过指令名称使用驼峰命名,则写到html中时候,全部采用小写,同时大写字母处用中横线[-]隔开

自定义指令 Demo

五、服务

服务就是把公共的一些行为或者常用的操作集合整体的打包整合在一起,方便后面不同的组件或者说模块去使用。
在服务调用的时候,我们需要了解一个词语 依赖注入

  1. var app = angular.module('app',[]);
  2. app.factory('服务名称',function(需要注入的内容){
  3. return function(){
  4. //TODO: 这里写相关的服务方法
  5. //最后在把方法return出去
  6. var a = function(a,b){
  7. console.log(a+b);
  8. }
  9. return a;
  10. }
  11. });

其实个人理解的服务相当于普通的 javascript 的方法集合封装

  1. //例子一:使用对象的形式存储方法集合
  2. (function(w){
  3. if(typeof w.msJs == "undefined"){
  4. w.msJs = {};
  5. }
  6. msJs = {
  7. a : function(a, b){
  8. console.log(a + b);
  9. }
  10. }
  11. })(window);
  12. //列子二:使用函数的形式存储方法集合
  13. (function(w){
  14. w.msJs = function(){
  15. return {
  16. a: function(a, b){
  17. console.log(a + b);
  18. }
  19. }
  20. }
  21. })(window);
  22. //例子三:使用函数的原型链存储方法集合
  23. (function(w){
  24. var fn = new Function();
  25. fn.prototype = {
  26. a: function(a, b){
  27. console.log(a + b);
  28. }
  29. }
  30. w.msJs = new fn();
  31. })(window);
  1. //在这里我们假设之前写的服务名称为 msJs
  2. var app = angular.module('app');
  3. app.controller('控制器名称',function(需要注入的服务名称)){
  4. msJs.a(1,2);
  5. }
  6. //在调用这个控制器后,控制台会直接打印(1 + 2)的和出来
  7. //如果是刚刚我们写的普通javascript的方法呢(如何调用)
  8. 1. 页面需要引用该js代码
  9. 2. 直接使用
  10. //例子
  11. msJs.a(1,2);

现在的前端开发中,大量的后端思想慢慢被引入了进来,依赖注入 就是其中之一。

依赖注入指的是,在系统中如果你需要调用一个方法则直接去使用他就行,二这个被注入的对象,就是你去使用的依赖,这个注入就是你将他拿到你身边等待去使用的状态。
对于依赖注入的这个对象(服务),是一个单列的形式,你不需要实列化就可以直接操作(调用)他。

六、过滤器

过滤器顾名思义就是对输出的数据进行预处理加工的意思,类似等同于前端习惯使用的 formater (格式化)

举个🌰子

  1. //后台穿给我们的json数据中,时间格式都使用了时间戳的格式
  2. 如:1478317615579
  3. //这个时候就需要过滤器预处理了
  4. <span> {{createTime | date:yyyy-mm-dd}}</span>

过滤器 Demo

七、路由控制

  1. //html:这是视图的填充位置,用 ng-view 标示
  2. //ng-view是唯一的
  3. <div ng-view></div>
  4. //javascript:
  5. var app = angular.module('app',['ngRoute'])
  6. app.config(function($routeProvider){
  7. //路由表配置
  8. $routeProvider
  9. .when('/',{template:'首页'})
  10. .when('/list',{template:'list页面'})
  11. .when('/list/detail',{template:'详情页面'})
  12. //如果输入的不符合路由表内指定的,则默认匹配'/' 页
  13. .otherwise({redirectTo:'/'});
  14. });

页面路由流程图

默认listlist/detailroot首页list页面详情页面

问题:
1. 浏览器什么时候会跳转什么时候不跳转?
2. 如何修改 URL 后保持浏览器不跳转?

修改URL浏览器不跳转 Demo

这里要说的是 UI-Route

  1. var app = angular.module("app",[]);
  2. app.config(function ($stateProvider, $urlRouterProvider) {
  3. $urlRouterProvider.when("", "/");
  4. $stateProvider
  5. .state("index", {
  6. url: "/index",
  7. templateUrl: "./tpl/index.html"
  8. })
  9. .state("list", {
  10. url:"/list",
  11. templateUrl: "./tpl/list.html"
  12. })
  13. .state("list.detail", {
  14. url:"/detail",
  15. templateUrl: "./tpl/detail.html"
  16. })
  17. .state("user/:id", {
  18. url:"/user",
  19. templateUrl:"./tpl/user.html"
  20. })
  21. });

其实无论内置的 route 还是外置的 ui-route 或者其他,他们的原理和方法都一样的只是谁比谁更适合你的业务场景,谁比谁更强大而已。

页面路由流程图

默认listlist.detaillist.searchuseruser.searchroot首页list页面详情页面搜索页面用户页面

最终,UI-Route可以实现网状路由的布局

八、Angularjs与服务器的交互

这是一个等价与 jQuery AjaxXHR(XMLHttpRequest)请求

  1. $http({
  2. url:'请求链接',
  3. method:‘GET/POST’,
  4. params:{
  5. //请求参数,会被转译为序列化字符串添加到URL后面
  6. },
  7. data:{
  8. //请求参数
  9. },
  10. timeout:3000 //请求超时时间
  11. }).success(function(){}).error(function(){});
  12. //这里请求成功和失败的处理流程和jQuery有些差异,是放在了配置项目之外
  13. //GET请求:
  14. $http.get().success().error();
  15. //POST请求:
  16. $http.post().success().error();
  17. //JSONP请求
  18. $http.jsonp();
  19. ...后面还有好几个类型的请求可自己补充

问题:
1. web开发中常见的http协议的请求类型一共有多少种,是哪几种?
2. 请求的成功和失败的状态码常见的有几种,分别表示什么意思?

$http应用Demo

这是$http的延伸,是用来专门处理 RESTful 规范的资源

  1. //1. 创建资源
  2. var User = $resource('/api/php/users/:userId', {userId:'@id'});
  3. //2. 调用资源
  4. User.get({id:'123'}, successFn, errorFn);
  5. User.get({id:'123'}, function(user){
  6. user.name = 'myName';
  7. user.$save();
  8. //这里等价于User.save({id:'123'},{name:'myName'
  9. })
  10. });

九、其他

十、学习路线指导

3/8/7/6/5/4/9/2

PS: 不实战的技术练不出好本领

angularjs 🌰 :


相关资料:

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注