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. c/c++编译和链接过程

    编译器把一个cpp编译为目标文件的时候,除了要在目标文件里写入cpp里包含的数据和代码,还要至少提供3个表:未解决符号表,导出符号表和地址重定向表. 未解决符号表提供了所有在该编译单元里引用但是定义并 ...

  2. java int and Integer

    本文转自:https://www.cnblogs.com/guodongdidi/p/6953217.html int和Integer的区别 1.Integer是int的包装类,int则是java的一 ...

  3. 曾经很强大的免费 ERP 2BizBox

    曾经很强大的免费 ERP 2BizBox 整个功能很强大,特别是生产,工单也很完善,有损耗,有反冲等功能. 流程比较规矩,需要先采购后才能使用,只有生产后才能销售,工单有组装和拆装,工程有工程更改,也 ...

  4. 并发运算lib

    最近对类似于erlang或者golang的并发运算很感兴趣.以下是看到的相关资料. libgo c++,技术:协程,多线程.这是俺发现的用法最漂亮的c++库,用法参考golang CAF 全称c++ ...

  5. centos7 关闭防护墙

    centos6 里面的默认防火墙 是  iptables, 所有 使用 service iptables  stop  就可以停止防火墙了. 但是 centos7 里面的 防火墙 叫做 firewal ...

  6. Go语言加解密--AES简单实践

    AES加解密的简单实现,代码如下. package main import ( "crypto/aes" "crypto/cipher" "encod ...

  7. 解决iScroll横向滚动区域无法拉动页面的问题

    近期项目中使用iScroll遇到一个问题,在设定wrapper为横向滚动时,如果你手指放在该区域,将无法拉动页面,也就是说该区域取消了默认事件.这个体验是实在是无法接受,特别是页面中有多个横向滚动区域 ...

  8. NDK开发: 打印C代码的调试信息Log

    1.引入头文件 #include <android/log.h> 2.修改Android.mk 在其中加入 LOCAL_LDLIBS+= -L$(SYSROOT)/usr/lib -llo ...

  9. Tomcat默认工具manager管理页面访问配置

    Tomcat的默认工具manager配置,在很多的生产环境中由于基本用不到.或者是不太需要使用Tomcat默认的manager管理页面时一般都会把Tomcat的默认webapp下的内容给删除了,但是如 ...

  10. 将Word,PDF文档转化为图片

    #region 将Word文档转化为图片 /// <summary> /// 将Word文档转化为图片 /// </summary> /// <param name=&q ...