当前位置 : 主页 > 网络编程 > JavaScript >

angular总结学习

来源:互联网 收集:自由互联 发布时间:2021-06-30
angular总结学习.txt //------------------------------大型项目中的angular分装写法---------------------//angular要学会封装(一个controller可以供多个页面使用)1.路由,服务,组件,控制器分开放在函数
angular总结学习.txt
//------------------------------大型项目中的angular分装写法---------------------//

angular要学会封装(一个controller可以供多个页面使用)
1.路由,服务,组件,控制器分开放在函数中调用方便
2.大框架
   第一步:引入主模块
   var app = angular.module('LepaiApp', []);
   一个是模板名,一个是依赖注入列表,
   第二步:配置http提供者,本地存储提供商,以及不正常链接引起的错误
app.config(['$httpProvider', 'localStorageServiceProvider','$compileProvider',
   function ($httpProvider, localStorageServiceProvider,$compileProvider) {
   localStorageServiceProvider.setPrefix('lepai');
   $compileProvider.aHrefSanitizationWhitelist(/^\s*(https?|native):/);
     $httpProvider.defaults.headers.post = {
	'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8'
	};
     $httpProvider.defaults.transformRequest = function (obj) {
        var str = [];
        for (var p in obj)
        str.push(encodeURIComponent(p) + "=" + encodeURIComponent(obj[p]));
        return str.join("&");
      };

    }
]);

第三步:模板的用法
 app.config(['$routeProvider',
      function ($route) {
	function then(u,c,s){return {controller:c, templateUrl:u,reloadOnSearch:s} }
	   $route.when('/', then('/mobile/home.html','MainController',false));
   	     }
	]);
   
route的html代码:
	index.html:
        
 
        子页面中的代码:
			
 
				
  商城
			
 
为模板的导航,相当于title

第四步:自定义组件用法(比如弹框中)比如$http的(公用)请求状态
app.factory('AnnouncementService', ['$http', 'localStorageService', '$location',
function ($http, localStorageService, $location) {
    return {
        get: function (id, cb) {
        var params = $location.search();
        if (id) {
            params.id = id;
            }
            var req = $http({
            url: '/api/mobile/announcement',
            params: params,
            method: 'get'
            }).success(function (data, status, headers, config) {
            cb(data);
            }).error(function (data, status) {
            cb(data);
            });
            }
        };
    }
]);  
    
app.factory('APIService', ['$http', 'localStorageService', '$location', '$q', '$route',
   function ($http, localStorageService, $location, $q, $route) { 
     var service = {
      	useGoods: function (info) {
	return $http({
		url: '/api/mobile/usegoods',
		method: 'post',
		data: info
	  }).then(function (response) {
		return response.data;
	  });
	},
      	usages: function () {
		return $http({
		url: '/api/mobile/usages',
		method: 'get'
	  }).then(function (response) {
		return response.data;
	     });
	},
      };
	return service;
    }
]);

用的时候直接用:
APIService.getBackpack().then(function (res) {}

第五步:编写控制器
app.controller('BackPackController', ["$rootScope", "$scope", "$http", "$location","APIService", "localStorageService", "SharedState",
      function ($rootScope, $scope, $http, $location, APIService, 
      localStorageService, SharedState) {
      //控制器中是对页面元素的控制配合angular的组件使用
      //其中的$scope是 当前作用于 $rootScope是根作用于
      //多用封装函数
    }
]);

第六步:指令调用
这块不做过多介绍,angular的指令有很多,都是在html中使用的,主要用来解析数据以及渲染接口中的数据:
angular中的表达式后面跟的都是一个js代码
常用子模块:ngMessages(表单验证)
           LocalStorageModule(本地存储)
           ngRoute(路由机制 不能嵌套更深层的路由)
           uiRoute()中可以嵌套更深层次的路由,也就是路由中可以有路由(问题路由中有路由的时候是否可以共用一个controller?)
1.AngularJS主要用于构建单页面Web应用
2.MVC,模型视图控制器增强了html
3.angular常用指令:
  ng-app=""初始化一个angular应用
  ng-init=""初始化应用程序数据。
  ng-model=""把元素值(比如输入域的值)绑定到应用程序中(常用在表单验证)
  ng-bind相当于{{ }}把表达式的数据绑定到html
  ng-repeat 用于便利一个数组
  用法:  
  • {{ x.name}}
  • 4.$scope相当于局部作用域只能在当前控制器下使用,而$rootScope则是全局作用域,可以在全局下使用 5.ng-repeat便利的是一个标签 ---------------------------------------------------------------------------------------------- Angular.js知识点总结 1.定义:Google开源的前端JS结构化框架 作用:动态展示页面数据,并与用户交互 指令:nagular定义的属性/标签/样式/注释 -- ng-app(指令):告诉angular管理当前标签声明所在的整个标签都由angular来解析管理 -- ng-model:将当前输入框的值与谁关联(属性名:属性值),并作为跟作用域对象($rootScope)的属性 将当前输入框的值关联到内存的$rootScope对象的指定属性(username)上 -- {{表达式}}:显示数据,从作用域对象的指定属性名上取 显示作用域对象($rootScope)上的属性值上 -- ng-inint: 初始化 特性:双向数据绑定、声明式依赖注入、解耦应用逻辑,数据模型和试图、完善的页面指令、定制表单验证、Ajax封装、测试更方便 2.angular是支持双向数据绑定的 View(视图):页面(标签、指令、表达式);Model(模型):作用域对象(属性、方法); 数据绑定: 数据从一个地方流向另一个地方,数据从一个位置自动流向另一个位置 单项数据绑定:只支持一个方向; View --> Model : ng-init Model --> View : {{name}} 双向数据绑定: Model <--> View : ng-model 3.作用域:是一个js实例对象 这个对象的属性、方法,页面都可以直接引用、操作 ng-app指令: 内部创建一个根作用域($rootScope),是所有其它作用域的父对象 4.控制器: 也是一个对象,是我们View与Model之间的桥梁 当我们使用了ng-controller指令,内部就会创建控制器对象 但我们同时的提供控制器的构造函数(必须定义一个$scope的形参) 每定义一个ng-controller指令,内部就会创建一个新的作用域对象输入构造函数中 5.依赖注入: 依赖的对象被别人(调用者)自动注入(传参) 注入的方式: 内部注入:不动态 全局变量:污染全局环境 形参: 动态 这种最好 angular就是通过声明式依赖注入,得到作用域对象 形参名不能随便定义(只是针对当前这种写法) 6.模块: 也是一个对象; 创建模块对象:angular.module('模块名', [依赖的模块]) 通过模块添加控制器: module.controller('MyController', function($scope){操作$scope的语句} angular的整体设计也是多模块的 核心模块:angular.js 扩展模块:angular-router.js angular-message.js angular-animate.js 7.表达式: {{js表达式}} 从作用域对象中读取对应的属性数据来显示数据 不支持if/for/while 支持三目表达式 8.Angular指令:指令(标签、标签属性、类、注释) Angular与Angular的Model交互,扩展页面的动态表现力 --常用的内置指令: ng-app:指定模块名,angular管理的区域 ng-model:双向绑定,输入相关标签(常用于input) ng-init: 初始化数据 ng-click:调用作用域对象的方法(点击时) ng-controller:指定控制器构造函数名,内部会自动创建一个新的作用域(外部的) ng-bind:解决使用{{}}显示数据的闪屏(在很短时间内显示{{}}) ng-repeat:遍历数组显示数据,数组有几个元素就会产生几个新的作用域('item in arr'); -- 属性: $index、$first、$last、$middle、$odd、$even ng-show:布尔类型,如果为true才会显示;false不显示隐藏 ng-hide:布尔类型,如果为false才会显示;true不显示隐藏 9.过滤器: 在显示数据时可以对数据进行格式化或过滤 单个-->格式化(将别的类型的数据转化为特定格式的字符串) 多个-->过滤(内部的个数变化,但类型不变) -- 不会真正改变被操作数据 语法:{{express | 过滤器名:补充说明}} --常用内置过滤器: currentcy:货币格式化(文本) number:数值格式化(文本) date:将日期对象格式化(文本) json:将js对象格式化为json(文本) lowercase:将字符串格式化为全小写(文本) uppercasw:将字符串格式化为全大写(文本) limitTo:从一个数组或字符串中过滤出一个新的数组或字符串(根据下标过滤) orderBy:根据指定作用域属性对对象进行排序 filter:从数组中过滤返回一个新数组(根据数据过滤) 10.自定义过滤器: 内置过滤器有限,不能满足页面显示数据的需求 语法: module.filter('myLimitTo', function(){ return function(value, startIndex, endIndex){ // 对value进行过滤处理,并return处理的结果 // 不要修改value本身 } }); 11.编写Angular应用的基本步骤: -- 编写基本静态页面; -- 将angular.js引入工程中,并在页面中引入 -- 在页面中指定ng-app, ng-controller -- 在js中定义model和controller -- 在controller中初始化数据($scope) -- 在页面中通过表达式或指令来显示数据 -- 在页面中使用ng-click添加点击监听,并定义对应的方法进行操作 12.服务: 为所有(angular)的应用提供特定功能服务的对象(单例),具有特定的功能可以是Object对象、函数、数组和基本类型 Augular内置多个服务(都以$开头),在controller函数中可以声明注入服务并直接使用 也可以自定义服务,但不要以$开头 -- 常用的内置服务: $rootScope与$scope(作用域) $filter(自定义) $http(数据交互) $timeout与$interval 当一个非angular调用的回调函数执行后,不会进行脏数据检查,即使数据变化也不会改变 显示、更新界面的基本步骤 1): 进行脏数据检查 2): 如果有变化,就去更新对应处 13.自定义服务: factory(): 可以自定义 对象 函数 。。。 -- 最常用 service(): 只能是对象 provider(): value(): constant(): 14.指令:(angular中最常用,用在html页面中) 内置指令: ng-click:点击事件 ng-blur:失去焦点 $event: 事件参数 ng-class: 值是一个对象 {} ng-style: 值是一个对象 {} ng-include: 动态插入一个模板页面(不是完整的html的页面,可以有表达式) 自定义指令: module.directive('指令名', function(){ restrict : 'ECMA', 默认'A' --> E(element:标签),C(class:类),M(mement:属性),A(attribute:属性) template : '简单的html标签',(常用) templateUrl : '包含模板标签结构的页面',-->内部会通过ajax请求得到其html片段模板(常用) replace : true/false, //是否替换指令所在的标签 默认false 若为true,模板就会完全替换标签,否则是插入其标签体(常用) scope: (常用) 使用什么作用域,默认为false,直接使用外部作用域作为当前作用域 如果为true,代表创建一个作用域继承自外部作用域 如果是{},代表创建一个隔离作用域,不从外部作用域继承 --> {} 隔离作用域的绑定策略: 1.基于字符串的绑定 使用 "@" 操作符,绑定的是指定标签属性的字符串 2.基于变量的绑定,使用 "=" 操作符,绑定的是外部作用域的变量 3.基于方法的绑定,使用 "&" 操作符,绑定的是外部作用域的方法 transclude:嵌入转换,默认false; 如果为true,需要与作用域和ng-transclude指令配合使用(常用) controller:引用某个Controller或定义一个新的controller(常用) -->function($scope, $element, $attrs, $transclude) compile:指定编译期执行的函数; 对模板DOM进行处理 -->function(){ return pre:function preLink(scope, element, attributes){...} post:function postLink(scope, element, attributes){...} 可以覆盖link的显示 } link : 指定链接期执行的函数; 将作用域和DOM进行链接(常用) -->function(scope, elements,attrs,contrller){ // scope是作用域的对象,通过它可以操作该作用域中的所欲的属性和方法 } require: 指定一个指令的名称(常用) "^xxx": 查找外部指令的控制器 "?xxx": 在当前指令中查找控制器,如果没有为null "xxx": 在当前标签中查找指令的控制器注入到当前指令的link函数中 "?^xxx": 两种情况都会查找 priority: 优先级,默认是0,最大是1000 优先级高的指令总是优先解析执行; --> ng-repeat的优先级是最高的 terminal: 是否终止优先级较低的指令执行,默认是false }) 15.依赖注入(DI: Dependency Injection):依赖的对象被自动注入进来 依赖对象:完成特定功能的函数需要某个对象才能实现, 这个对象就是依赖对象 引入依赖对象: 方式一: 内部自己创建 : 不动态 方式二: 全局变量 : 污染全局命名空间 方式三: 形参引入依赖 : 依赖注入使用的方式 定义: 1). 定义函数时, 使用形参声明依赖对象变量, 在函数体中使用依赖对象(我们实现) 2). 函数调用时, 自动将创建好的依赖对象动态传入(框架实现) 3). 例子: 事件监听就使用了依赖注入, event就是依赖对象(event可以是任意名称) angular的依赖引入:形参必须是特定的名称, 否则Angular无法注入抛异常 16.$apply和$watch方法: $apply(): 1). 当scope中的数据发生了改变, angular会将数据同步显示到页面, 这一操作称为"脏数据检查" 2). angular在它的方法执行完后, 都会进行脏数据检查, 3). 在原生JS函数中改变作用域数据, angular是不会进行脏数据检查的 4). 使用$scope的$apply函数可以解决此问题 $scope.$apply(function(){ //在这里更新scope数据, angular会同步更新其页面数据 }); 5). $apply()的本质是调用$digest()去进行脏数据检查更新页面的 $scope.$digest() 6). $apply()虽然也能实现页面更新, 但建议使用$apply() $watch(): 1). angular是双向数据绑定的, Scope中的属性数据发生了改变, 会自动更新页面中对应的数据 2). 但有时, 我们想监视数据的变化情况, 来实现特定的功能 3). Angular提供了$watch()来实现 var unWatch = $scope.$watch('propertyName', function(newValue, oldValue){}, deepWatch) 参数一: 指定监视属性的属性名 参数二: 发现数据发生改变时的回调函数 参数三: 是否深度监视, 默认是false, 代表只是监视属性本身, 而不监视其内部数据 返回值: 用于取消监视的函数, 调用unWatch()取消监视 17.视图和路由 SPA:(simple page application) 单页应用 对单页应用来讲,视图和路由的作用可以从一个视图跳转到另外一个视图,可以合理管理用户在使用过程中看到的界面 -- 引入:将angular-route.js添加到项目中-->在页面中引入此文件-->创建应用module时加载此模块 -- 实例: 主页面:
    • click a
    • click b
    模板页面a: {{hello}} 模板页面b: {{hello}} JS实现: angular.module('myApp',['ngRoute']) .config(function ($routeProvider) { $routeProvider .when('/a', { templateUrl : 'a.html', //加载指定template页面替换 controller : 'AController' }) .when('/b', { templateUrl : 'b.html', controller : 'BController' }) .otherwise({ redirectTo : '/a' }); }) .controller('AController', function ($scope) { $scope.hello = "this is a.html"; }) .controller('BController', function ($scope) { $scope.hello = "this is b.html"; }) .controller('MyController', function($scope){ //$scope.hello = "this is xxx.html"; }); 18.表单验证: 使用angular-messages扩展库 安装Chorme插件:AngularJS Baterarang 可以查看作用域对象中的属性变化情况 表单:当前$scope下会有对应的属性对象, 属性名为form的name属性 表单对象包含以下重要属性: 1). $dirty : 表示用户是否输入过数据, 初始值为false, 一旦用户输入数据就会为true 2). $valid : 表示整个表单是否是合法的, 一旦有一个表单项不合法,就会为false 3). $invalid : 与$valide值相反 4). 表单项属性: 保存表单项的验证相关信息 表单项:form属性对象下有对应的属性对象, 属性名为表单项的name属性,表单项对象包含以下重要属性 1). $dirty : 表示用户是否输入过数据, 初始值为false, 一旦用户输入数据就会为true 2). $valid : 表示整个表单是否是合法的, 一旦有一个表单项不合法,就会为false 3). $invalid : 与$valide值相反 4). $error : 包含错误名称的对象, 属性名为特定的验证名称, 值为true: {require : true} 编码: 在表单字段上定义验证指令: ng-required = "true" 必填项; ng-minlength ng-maxlength ng-pattern="/^[a-zA-Z]$/" type="email/url" min max 提示信息: ng-messages: 读取表单项中的$error对象 ng-messages="nameForm.username.$error" ng-message: 读取$error对象中验证名称属性,如果为true才会显示当前标签 ng-message="minlength" ng-show: 控制包含提示信息的标签是否显示 ng-show="nameForm.username.$dirty&&nameForm.username.$invalid" ng-bind: 指定提示信息文本字符串 ng-bind="字符串最少为4" ng-class: 避免出现红色提示区域闪烁的情况 ng-class="'alert alert-danger help-block'" 实例: 19.MVC与MVVM: 通用: 模型Model: 存储数据的实体模型,操作数据的业务模型 视图View: 显示数据,响应用户操作,与用户进行交互 控制器Controller:操作模型数据,更新视图,View与Model之间的桥梁 angular中的MVC: 模型Model: scope 存储数据的容器 提供操作数据的方法 视图View: html/css/directive/expression 显示Model的数据,将数据同步到Model 与用户交互 控制器Controller: controller 初始化Model的数据 为Model添加行为方法 MVVM: View <--> ViewModel <--> Model MVVM是MVC的进化版,Angular使用的是MVVM 双向数据绑定 ---------------------------------------------------------------------------------------------------- 备注:如有错误与不全面的地方希望大牛补充,谢谢!!!!!! 更多内容请访问: angular中的自定义过滤器使用:http://git.oschina.net/hjm100/codes/nr9vfgxh3tzajiswl6omd34 angular中的服务使用:http://git.oschina.net/hjm100/codes/6scz41ryv9xf70gtbowkh50 angular总结学习:http://git.oschina.net/hjm100/codes/uohp5vsbljqyr1298eixn92 angular中的tab切换:http://git.oschina.net/hjm100/codes/q1csxnui6thoda8melzjf29
    网友评论