Best Practice AngularJS
Best Practice AngularJS
/* 用几组简明扼要的代码段及其说明, 展示良好的编程行为, angularjs */
// app.module.js
angular
.module('app', ['ngRoute']);
// logger.js
(function() {
'use strict';
angular
.module('app')
.factory('logger', logger);
function logger() { }
})();
/*
Single Responsibility 单一责任的文件,小函数
* 1个组件, 1个文件, <400LOC (代码行)
* Small Functions,小函数 < 75LOC(1屏幕), 易于重用,维护和测试
用IIFE减少全局变量
* 类和组件, 要包裹在IIFE里面, (立即执行的函数表达式) Immediately Invoked Function Expression .
*减少全局变量, 从而减少这些变量的寿命,和重名
Modules模块定义
避免产生额外的全局变量:
* 在定义module的时候, 用chain,不要用setter语法引入中间变量,
* 在引用module的时候, 用chain + getter语法, 不定义中间变量。
* 一个module只能创建1次, 多次引用
* 用有名函数, 不要用callback, 以避免Nested的callback
*/
/* 在view中:
<div ng-controller="CustomerProductController as ProductVm">
<input ng-model="ProductVm.title"/>
</div>
*/
angular
.module('app')
.controller('CustomerProductController', CustomerProductController);
CustomerProductController.$inject = ['dataservice', 'logger'];
function CustomerProductController($scope, dataservice, logger) {
var vm = this;
vm.refresh = refresh;
vm.search = search;
vm.sessions = [];
vm.title = 'Sessions';
////////////
function refresh() {
}
function search() {
}
$scope.$watch('vm.title', function(current, original) {
$log.info('vm.title was %s', original);
$log.info('vm.title is now %s', current);
});
}
// route-config.js
angular
.module('app')
.config(config);
function config($routeProvider) {
$routeProvider
.when('/customerProduct', {
templateUrl: 'customerProduct.html',
controller: 'CustomerProductController',
controllerAs: 'productVm'
});
}
/*
Controllers
* 在view中用as语法代替$scope, 类似于new一个实例,接近本色的.语法., 避免$parent,
* 在controller自身中, 用vm(view Modal)代替this,避免歧义,并减少$scope,(仅仅剩余在$emit, $broadcast, $on, $watch等少数情况下,必须用$scope)
* 把bindable函数写在前面, 并按照字母排序, 具体的实现放在后面(如果实现只有1行,可以直接写)。
让重要的函数一览无余, 而且与函数的顺序无关。
* 薄controller, 厚service: 尽量把controller的逻辑下放到services,便于重用,和unit test
* 让controller专注到1个view, 不要重用,因为UI经常变,(而让可重用部分下放给service)
* 在route中定义controller和view,而避免在view中直接指定controller(绑死了),这样, 可以灵活地在route中重用view与controller。
*/
// service全部改用factory
angular
.module('app')
.service('logger', logger);
function logger() {
this.logError = function(msg) {
};
}
// factory
angular
.module('app')
.factory('logger', logger);
function logger() {
return {
logError: function(msg) {
}
};
}
/*
Services
* 用factory代替service,
以简化,并保持一致性。
因为,所有的service都是singleton,而且用new来实例化。
*/
function dataService($http, $location, $q, exception, logger) {
var isPrimed = false;
var primePromise;
var service = {
getAvengers: getAvengers,
ready: ready
};
return service;
////////////
function getAvengers() {
}
function ready(nextPromises) {
// implementation details go here
}
}
/*
Factories
* 与Controller一样的地方:(任务要单一, 接口函数放在前面)
* factory都是singleton, 返回的object包括了其所有接口函数
*/
// dataService.js
angular
.module('app.core')
.factory('dataService', dataService);
dataService.$inject = ['$http', 'logger'];
function dataService($http, logger) {
return {
getAvengers: getAvengers
};
function getAvengers() {
return $http.get('/api/maa')
.then(getAvengersComplete)
.catch(getAvengersFailed);
function getAvengersComplete(response) {
return response.data.results;
}
function getAvengersFailed(error) {
logger.error('XHR Failed for getAvengers.' + error.data);
}
}
}
// controller.js
angular
.module('app.avengers')
.controller('AvengersController', AvengersController);
AvengersController.$inject = ['dataService', 'logger'];
function AvengersController(dataService, logger) {
var vm = this;
vm.avengers = [];
activate();
function activate() {
return getAvengers().then(function() {
logger.info('Activated Avengers View');
});
}
function getAvengers() {
return dataService.getAvengers()
.then(function(data) {
vm.avengers = data;
return vm.avengers;
});
}
}
/*
Data操作全部用Service
* 抽出data操作, 例如:http, local storage, db都纳入service中, (不要放在controller中)
* 返回promise, 以利于chain操作
*/
// 对于controller和service
AvengersController.$inject = ['moviesPrepService'];
// 对于 route
function config($routeProvider) {
$routeProvider
.when('/avengers', {
templateUrl: 'avengers.html',
controller: 'AvengersController',
controllerAs: 'vm',
resolve: {
moviesPrepService: moviesPrepService
}
});
}
moviesPrepService.$inject = ['movieService'];
function moviesPrepService(movieService) {
return movieService.getMovies();
}
/*
Manual Annotating for Dependency Injection: 手工注入, 让minify安全
*/
/*
其余主题:
Minification and Annotation: 注释,适合minify的
Exception Handling
*/
/* Naming: 命名规范
featureType.js
*/
用几个代码段, 和 简要的 原则注释, 来直观地展示编程好习惯。
angularjs1,2的
js的
dom的
类和子类的
module的
https://github.com/johnpapa/angular-styleguide/blob/master/a1/README.md
https://github.com/johnpapa/angular-styleguide/blob/master/i18n/zh-CN.md
Best Practice AngularJS的更多相关文章
- angularJS学习资源最全汇总
基础 官方: http://docs.angularjs.org angularjs官方网站已被墙,可看 http://www.ngnice.com/: 官方zip下载包 https://github ...
- AngularJS Providers 详解
供应者(Providers) Each web application you build is composed of objects that collaborate to get stuff d ...
- 【转】Build Your own Simplified AngularJS in 200 Lines of JavaScript
原文:http://blog.mgechev.com/2015/03/09/build-learn-your-own-light-lightweight-angularjs/ Build Your o ...
- AngularJS中实现服务端分页
这个教程将介绍在AngularJS应用中的服务端分页处理.在任何涉及到列表或表格数据的应用中都可能会用到分页. 概念 当我们处理异步分页时,每次只从服务器上获取一页数据.也就是说当用户点击第二页,就只 ...
- [AngularJS] Angular 1.3 Anuglar hint
Read More: http://www.linkplugapp.com/a/953215 https://docs.google.com/document/d/1XXMvReO8-Awi1EZXA ...
- angularJS web应用SEO
javascript给网站带来丰富的用户体验,越来越多的网站开始应用angularjs/emberjs这类MVC来开发web应用,可以说能够使用native方式来看法的手机app基本都可以使用替代的j ...
- AngularJS入门之如何快速上手
概述: AngularJS(ng)是一个纯JS框架,AngularJS易于构建CRUD应用(CRUD意思是增删改查) 适用于以数据操作为主的SPA(Single Page Application) ...
- ANGULARJS: UNDERSTANDING DIRECTIVE SCOPE
https://www.3pillarglobal.com/insights/angularjs-understanding-directive-scope --------------------- ...
- 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇
什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...
随机推荐
- 基于.NET平台常用的框架整理 【转载】
[转载] http://www.cnblogs.com/hgmyz/p/5313983.html 自从学习.NET以来,优雅的编程风格,极度简单的可扩展性,足够强大开发工具,极小的学习曲线,让我对这个 ...
- jmap获取内存排名靠前的对象
docker部署,jvvm通过jmx访问失败,只能永远是的jdk自带工具查看情况: jmap -histo pid | sort -n -r -k 2 | head -10
- python 通过pymongo操作mongoDB执行sort
在mongo shell 中对数据进行排序操作的时候 db.getCollection('ANJUKE_PRICE').find({},{'id':1,'_id':0}).sort({'id':1}) ...
- Linux split命令详解
Linux split命令 Linux split命令用于将一个文件分割成数个.该指令将大文件分割成较小的文件,在默认情况下将按照每1000行切割成一个小文件. 将输入内容拆分为固定大小的分片并输出到 ...
- docker-compose编排springcloud微服务
.创建注册中心Eureka package com.dan.eurekaserver; import org.springframework.boot.SpringApplication; impor ...
- Java 可执行jar的manifest编写
Eclipse:形式, 选中项目右键 命令行形式: 1.编写Java类 2.命令行指定到项目/src文件夹,编译 3.编写manifest文件 4.目录重新定位到bin/classes编译文件目录下, ...
- windows defender和windows firewall
Windows defender: Windows Defender,曾用名Microsoft Anti Spyware,是一个杀毒程序,可以运行在Windows XP和Windows Server ...
- Tomcat实战-调优方案
Tomcat的默认配置,性能并不是最优的,可以通过优化tomcat以此来提高网站的并发能力.提高Tomcat的性能可以分为两个方向. 服务器资源 服务器所能提供CPU.内存.硬盘的性能对处理能力有决定 ...
- ALGO-141_蓝桥杯_算法训练_P1102
定义一个学生结构体类型student,包括4个字段,姓名.性别.年龄和成绩.然后在主函数中定义一个结构体数组(长度不超过1000),并输入每个元素的值, 程序使用冒泡排序法将学生按照成绩从小到大的顺序 ...
- 微信小程序客服消息使用
客服消息使用 为丰富小程序的服务能力,提高服务质量,微信为小程序提供客服消息能力,以便小程序用户可以方便快捷地与小程序服务提供方进行沟通. xiaokefu.com.cn 功能介绍 用户可使用小程序客 ...