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的更多相关文章

  1. angularJS学习资源最全汇总

    基础 官方: http://docs.angularjs.org angularjs官方网站已被墙,可看 http://www.ngnice.com/: 官方zip下载包 https://github ...

  2. AngularJS Providers 详解

    供应者(Providers) Each web application you build is composed of objects that collaborate to get stuff d ...

  3. 【转】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 ...

  4. AngularJS中实现服务端分页

    这个教程将介绍在AngularJS应用中的服务端分页处理.在任何涉及到列表或表格数据的应用中都可能会用到分页. 概念 当我们处理异步分页时,每次只从服务器上获取一页数据.也就是说当用户点击第二页,就只 ...

  5. [AngularJS] Angular 1.3 Anuglar hint

    Read More: http://www.linkplugapp.com/a/953215 https://docs.google.com/document/d/1XXMvReO8-Awi1EZXA ...

  6. angularJS web应用SEO

    javascript给网站带来丰富的用户体验,越来越多的网站开始应用angularjs/emberjs这类MVC来开发web应用,可以说能够使用native方式来看法的手机app基本都可以使用替代的j ...

  7. AngularJS入门之如何快速上手

      概述: AngularJS(ng)是一个纯JS框架,AngularJS易于构建CRUD应用(CRUD意思是增删改查) 适用于以数据操作为主的SPA(Single Page Application) ...

  8. ANGULARJS: UNDERSTANDING DIRECTIVE SCOPE

    https://www.3pillarglobal.com/insights/angularjs-understanding-directive-scope --------------------- ...

  9. 通过AngularJS实现前端与后台的数据对接(二)——服务(service,$http)篇

    什么是服务? 服务提供了一种能在应用的整个生命周期内保持数据的方法,它能够在控制器之间进行通信,并且能保证数据的一致性. 服务是一个单例对象,在每个应用中只会被实例化一次(被$injector实例化) ...

随机推荐

  1. KiCad 如何在原理图添加元件时看到 PCB 封装?

    KiCad 如何在原理图添加元件时看到 PCB 封装? 这个功能默认是关闭,评估关闭的原因是因为 PCB 封装很大,而且在前期也没必要详细知道 PCB 封装. 但是有时修改可以看到 PCB 封装会方便 ...

  2. jumpserver修改默认管理员账号名

    1.安装完毕jumpserver之后,默认管理员账号为admin 显然类似windows的administrator以及linux的root 把账号名改成别的 个人信息界面点击设置 修改为自己想要的用 ...

  3. 函数防抖(Debounce)、函数节流 (Throttle)

    一篇介绍文章:https://zhuanlan.zhihu.com/p/38313717 演示示例:http://demo.nimius.net/debounce_throttle/ 函数防抖(Deb ...

  4. JVisualVM监控本地Java进程

    一.基于JVisualVM的可视化监控 1.打开C:\Program Files\Java\jdk1.8.0_131\bin下的jvisualvm.exe 2.打开后,会列出本机所有的Java进程 3 ...

  5. windows10中git-bash闪退的解决办法

    windows10中git-bash闪退的解决办法 出现错误详情 Windows10 64位专业版安装git .18之后出现 Git闪退,报错信息:bash: /dev/null: No such d ...

  6. Docker+Nginx部署Angular

    在部署Angular生产环境之前,需要电脑已经安装docker. 添加Dockerfile在已经完成的Angular项目的项目根目录下添加Dockerfile文件. Dockerfile文件内容: F ...

  7. IntelliJ IDEA maven项目 ***

    创建一个新Maven项目 new 一个project 不选择任何Maven模板 起个GroupId.ArifactId 起个项目名.注意:Idea_Project是存放此项目的工作区间,mavenDe ...

  8. Django--bug--ImproperlyConfigured: The SECRET_KEY setting must not be empty.

    Django配置Restframework后,建立用户模型,执行迁移的时候报如下错误: django.core.exceptions.ImproperlyConfigured: The SECRET_ ...

  9. 胖子哥的大数据之路(10)- 基于Hive构建数据仓库实例

    一.引言 基于Hive+Hadoop模式构建数据仓库,是大数据时代的一个不错的选择,本文以郑商所每日交易行情数据为案例,探讨数据Hive数据导入的操作实例. 二.源数据-每日行情数据 三.建表脚本 C ...

  10. 修改ECSHOP的小数点保留位数

    客户站点http://carfa.hk79.2ifree.com 原来的程序直接取整了,现在做下面修改. 首先打开文件 /carfa/web/includes/lib_common.php 第一步:在 ...