Angularjs开发一些经验总结

       在去年到今年参与了2个使用Angularjs作为客户端开发框架的项目开发。主要利用asp.net web api作为restfull服务提供框架和angularjs结合。Angularjs作为html的扩展,旨在建立一个丰富的动态web应用,通过Directive建立一套html扩展的DSL模型,利用PM模式变形MVVM(在网上很多称MVC模式,本人认为在angular0.8是属于经典MVC模式,但在1.0把scope独立注入过后,更倾向于MVVM模式,这将会后续随笔中写道)简化前端开发和使得前端业务逻辑得以分离,view和表现逻辑的分离,更便于维护,扩展。Angularjs本来就是采用TDD开发的,提供了一套单元测试组件和End 2 End的测试框架。Angularjs的的强大之处在于提供了一套内似WPF,Silverlight的强大数据绑定和格式化,过滤组件,这也是MVVM模式所必备的条件;再加之IOC的注入机制,使得不能业务逻辑的分离,服务代码的更大程度抽象重用。

     在这节随便中将讨论的angularjs开发的一些基本准则,为什么会有这篇随便呢,因为看见一些项目对于angularjs的乱用。

  1:不要一个page一个God似无所不能的controller包含所有页面逻辑。

        Angularjs ng-controller旨在将业务逻辑的区分,更推荐按照业务逻辑的划分controller,做到业务功能的高内聚,controller的单一原则SRP。

  2:View中包含尽量少的逻辑。

       就像jsp,asp这类服务端模板引擎一样,我们应该把尽量少的逻辑放在view中,因为这样会导致view和逻辑的紧耦合性,view在软件开发中是最易变化的,而表现层逻辑却相对于view是相对稳定的行为。同时也导致的view中的逻辑不能被自动化测试,持续集成所覆盖,这将导致以后修改重构和模块的集成的痛苦。很明显的就是太多的angularjs的ng-switch,ng-when和页面计算表达式等等。

3:注意一些特殊的节点式的angularjs directive,因为在IE7上这是不被认识的,因为IE的严格XML模式。如果你想make ie7 happy,

     1:请注意导入json2或者json3的js

     2:xmlns:ng命令空间和节点element式directive。

<html xmlns:ng="http://angularjs.org">

<head>

<!--[if lte IE 8]>

<script>

document.createElement('ng-include');

document.createElement('ng-pluralize');

document.createElement('ng-view');

 

// Optionally these for CSS

document.createElement('ng:include');

document.createElement('ng:pluralize');

document.createElement('ng:view');

</script>

<![endif]-->

</head>

    3:除官网介绍的几个注意点之外 需要将

<div ng-app="xxx">

改为
<div id="ng-app" ng-app="xxx">

 另外注意html 头部要引入(否则会进入坑爹的quirk模式)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

 

4:在controller和service中绝对不能出现html的DOM和CSS代码。

      这会导致逻辑的混杂耦合,对于angularjs自身的绑定对html操作,很多时候你会分不清是view的影响源,导致修复bug,和新增功能,重构的艰难,常常出现很多的诡异行为。最好的实践模式则是把必须的dom,css操作移向angular的Directive,或者view中。在angularjs模式中只有directive和view才能出现dom和css的逻辑操作。

  5:controller中公用的逻辑推向service(factory,value,config),采用IOC的注入,提高代码的重用度,修改的单一点,开闭原则。

  6:controller应该只包含业务逻辑,对于数据模型的格式化过滤尽量交给angular框架filter等处理。

7:viewmodel中最好建立一个通用属性比如vm,它承载view渲染的最小量化model,对于model的变形事件则在vm之外scope之上。这才是MVVM推荐方式。事件相当于WPF中的command,负责模型事件的传递修改模型,从而从模型的改变通知view的强制更新(WPF中model必须实现INotifyPropertyChange接口)。同时这样vm属性也便于数据的填充和收集回发服务端。

8:IOC注入优先,有助于良好的设计,逻辑的可重用和单元模块的可测试性,面向对象的“开闭原则”,修改的单一点。

9:良好的分层设计,对于view的交互采用controller通过viewmode(scope)的推送,与服务器的交互推向service层次,利用angularjs的$resource或者$http获取更新数据model,以及与服务端交互。层次划分属于纵向分割,将相同功能逻辑的接口放在一起,架构层次,而model则从业务的逻辑横向分离。

10:服务端的服务的接口需要考虑表现层客户端的应用提供,这是一个良好的SOA服务设计的准则,这里不用多余的描述,具体请移步架构篇

11:如果你的公司应用了敏捷开发则,TDD的开发是必备的,angularjs本也是解决javascript测试驱动开发项目。

 12:scope的纯净性,scope上的每一个函数和属性必须为view所用(事件传递或者属性绑定),不用的可以作为工具函数或者service处置.

 13:对controller之间如果不是强依赖,只是弱引用则最好用事件$emit,$on,$broadcast,是的controller之间低耦合(Angularjs Controller 间通信机制)。

 14:angularjs的的模块管理参见如何组织大型JavaScript应用中的代码?.

 

   最后想说说angularjs也不是银弹,并不是万能的,不是所有的项目都适合应用,它适用于CRUD的应用系统,内置了一些默认规则(惯例优先),对于表现层频繁交互的项目不适用,对于一些特殊的项目比如spring hdiv的项目也不是那么友好,或者就是你希望兼容更多的IE8一下的版本的应用系统,同样也不实用。

作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2013/03/24/2979344.html

时间: 2024-11-10 00:16:12

Angularjs开发一些经验总结的相关文章

我的 Android 开发实战经验总结

我的 Android 开发实战经验总结 字数4440 阅读5137 评论43 喜欢250 以前一直想写一篇总结 Android 开发经验的文章,估计当时的我还达不到某种水平,所以思路跟不上,下笔又捉襟见肘.近日,思路较为明朗,于是重新操起键盘开始码字一番.先声明一下哈,本人不是大厂的程序猿.去年毕业前,就一直在当前创业小团队从事自己热爱的打码事业至今.下面总结是建立在我当前的技术水平和认知上写的,如有不同看法欢迎留下评论互相交流. 1.理解抽象,封装变化 目前 Android 平台上绝大部分开发

最受欢迎的十款 AngularJS 开发工具

AngularJS 是 Google 推出的一款 Web 应用开发框架.它提供了一系列兼容性良好并且可扩展的服务,包括数据绑定.DOM 操作.MVC 设计模式和模块加载等,同时也是那些想要以动态形式开发 Web 应用的开发者最喜欢的框架之一. 作为一个为动态 Web 应用设计的结构框架.AngularJS 能让你使用 HTML 作为模板语言,通过扩展 HTML 的语法,让你能更清楚.简洁地构建你的应用组件.它的创新点在于,利用数据绑定和依赖注入,它使你不用再写大量的代码了.这些全都是通过浏览器端

Ubuntu系统下Angularjs开发环境安装_AngularJS

一.win7环境下安装ubuntu系统  http://jingyan.baidu.com/article/60ccbceb18624464cab197ea.html  注意:在安装的第四步选择"安装ubuntu系统,与win7系统共存"这一项,这样可以免去后面的分区,安装更方便 二.安装jdk8  http://hi.baidu.com/270460591/item/5a6a9bcf8f352e4dbdef69cd  注意:配置文件改为在~/.bashrc里面加入 export JA

《.NET 2.0面向对象编程揭秘》作者—金旭亮与您探讨.NET软件开发实践经验

问题描述 10月26日,CSDN将举办第二次SD俱乐部活动,活动邀请到拥有十多年的软件开发实践经验的北京理工大学计算机系教师--金旭亮,他将结合自己多年来的软件开发实践经验,现场编程展示实际软件开发过程,点出技术关键,并加以适当的扩充与引申,帮助程序员们加深对复杂编程技术的理解与把握,增强开发能力.[讲座主要内容]:[限制50人]第一部分从理论到实践(OOD,OOP,OOT的实例):这部分以一个支持括号与运算符优先级的四则运算器为实例,先在理论上设计出可行的计算机算法,紧接着将数据结构与算法转化

C#开发微信门户及应用(44)--微信H5页面开发的经验总结

在我们开发微信页面的时候,需要大量用到了各种呈现的效果,一般可以使用Boostrap的效果来设计不同的页面,不过微信团队也提供很多这方面的资源,包括JSSDK的接口,以及Weui的页面样式和相关功能页面,给我们提供了很大的便利,本文是在自己做的一些H5微信应用页面上做了一些功能总结,希望能够给大家提供一定的帮助. 1.微信网页开发 1) JSSDK 微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包.通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语

Java程序员转Android开发必读经验一份

啰哩啰嗦的说说Java和Android程序的区别: Android是主流智能手机的操作系统,Java是一种开发语言,两者没有好坏优劣之分,只是两种职业岗位的选择.学安卓从事移动互联方向开发,学Java从事软件.网站开发.而安卓上的应用大多是Java编写的,所以建议在安卓前期的Java学习阶段中,要用心学好. 言简意赅的说说"转"前的准备: 其实Java程序员要自学安卓开发的基础知识还是没有什么难度的,毕竟语言相通,特性相似,阅读安卓源代码的门槛以比较低一些,作为能够考虑"转&

设计&amp;amp;开发 配合经验总结

搞了一年的iOS开发了,希望在这里记录一些设计师和开发者配合方面的一些经验 主要也是记录图片使用和命名方面的一些经验 App 启动展示图名称: 3GS:Default.png 3.5x-inch Retina:Default@2x.png 4x-inch Retina:Default-568h@2x.png App 图标名称: 3GS:icon.png Retina:icon@2x.png 1:切图的高度,直接决定在iPhone 显示的高度. 这篇帖子介绍了关于如何提到切图效率的技巧和经验 ht

AngularJS开发的理念

将DOM操作和应用逻辑解耦是一种非常好的思路,它能大大改善代码的可调性: 将测试和开发同等看待是一种非常非常好的思路,测试的难度在很大程度上取决于代码的结构: 将客户端和服务器端解耦是一种特别好的做法,它能使两边并行开发,并且使两边代码都能实现重用: 如果框架能够在整个开发流程里都引导着开发者:从设计UI,到编写业务逻辑,再到测试,那对开发者将是极大的帮助: "化繁为简,化简为零"总是好的. AngularJS能将你从以下的噩梦中解脱出来: 使用回调:回调的使用会打乱你的代码的可读性,

从Google+上面可以学到哪些产品开发的经验及教训?

中介交易 SEO诊断 淘宝客 云主机 技术大厅 导语:Google+的管理层发生了变动,引来媒体的诸多猜测.但更多的是从公司问题层面来讨论,如果仅从产品本身来看呢?Google+将带给我们哪些教训? 在本文开始之前,笔者必须要提前申明一下,我之前曾在Google+的创始团队工作,也是Circles(圈子)背后的创意发明者,不过,我现在已经离开了谷歌,而且对于他们的现状也没有任何内幕消息.当然,本文更不会涉及任何保密信息,相关内容都是根据公开信息推测出来的.在此,我只是把自己的想法与大家分享,帮助