自从上一篇文章到现在已经有将近一个月的时间,我将精力放在了前端页面分解与组装,和angularjs如何与jquery、bootstrap、D3等一系列其他类库结合使用的经验总结上。由于公司新招了一些员工,对于我而言快速的做出demo页面用以示范,是让新人快速上手的最佳方案。即使这段时间工作较忙,写这样大段文字的时间确实不好找,但我依然必须勤做记录,否则灵感如昙花一现转瞬即逝,如何带领新人,推动项目?故而我只能知无不言,把我所关注过的大小重点都记录下来。

那么接下来我先讲讲用angularjs如何实现前端分页。

在我的上一篇文章angularJs项目实战!01:模块划分和目录组织 可以看到,我所作的应用根据用户权限和功能划分了5个模块,每个模块都有不同的入口点。 这就产生了一个问题,模块之间有许多相同的内容——包括模板、组件、和通用JS模块。前端有一个特点,就是变更频繁。从项目一开始就是如此。故而,我们必须把这些相同的内容抽取出来,这样一旦遇到变更,就很容易修改。否则,你更改一个logo就要改5个模块的不同页面,累不说,出错的概率也是非常之大。这点相信大家都有所理解。

过去,这个工作一般都是后台动态脚本来完成,我们大家也很熟悉。 例如在php中,你可以把首页模板index.php划分为header.php, container.php, footer.php三个文件,然后通过include等方法来组装。同样的功能放在前端有点不一样。 angularJs提供了三个方法来进行前端分页,

其一,使用ng-view.这个方法是angular小组推荐使用的方案。通过使用路由控制,可以方便的实现页面组合。但这个方法也有一个重大缺点,就是一个html文件中,只能有一个ng-view.为什么只能有一个?事实上github已经有人给angular小组提出了自己的方法,通过给ng-view指定不同的名称,路由的时候也需要指定显示在哪个ng-view里,从而实现同一html中多个ng-view的绑定。但是,截止到1.1.5版,这个方案依旧没有被官方采纳。这个问题我想谷歌angular小组肯定有自己的理由。是担心路由混乱还是害怕搞出类似过去开发常见的iframe地狱?这个问题我没有深究。若有高玩告诉我,这里我就先谢谢了。这个问题我止步于Ui-router,一个angularjs的扩展。有兴趣的同学可以去了解一下。 http://angular-ui.github.io/

其二,将分解的页面写成directive. 例如下面这个样子:

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
angular.module('pageComponents',[],function($compileProvider){
        $compileProvider.directive('commonHeader',function($compile){
            return{
                templateUrl:'application/views/frontEnd/build/templete/common/common_header.html',
                replace:true,
                transclude:false,
                restrict:'A',
                scope:false  
            };
        });
        $compileProvider.directive('commonFooter',function($compile){
            return{
                templateUrl:'application/views/frontEnd/build/templete/common/common_footer.html',
                replace:true,
                transclude:false,
                restrict:'A',
                scope:false  
            };
        });
    });

事实上,还可以更进一步,将templateUrl写成可传入的参数。但是那样的话就跟下面这个方法差不多了。

第三,使用ng-include

这里最好先看一下angularjs的API:http://docs.angularjs.org/api/ng.directive:ngInclude

使用ng-include非常简单。请注意src的参数是表达式,如果要传静态的字符串参数,请用引号将参数包裹起来。就像下面这个例子。

<div ng-include src=”‘example.html’”></div>

利用ng-include,再结合ng-view,实现之前所说的页面分解和组装已经很容易了,将主页面index.html分解为header.html\container.html\footer.html三部分,我们前端可以这样实现分解与组合:

<!– header –>

<ng-include src=”‘common_header.html’”></ng-include>

<div class=”container”>

<div ng-view></div>

</div><!– /container –>

<!– Footer –>

<ng-include src=”‘common_footer.html’”></ng-include>

对ng-include稍作处理,可以实现更复杂的功能。例如下面这个动态加载表单页面的例子,就是通过变换ng-include的src参数实现的。

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
$compileProvider.directive("dynamicFormInput",['$http','$templateCache',
        function($http,$templateCache){
            return{
                restrict:'E',
                scope:{
                    model:'=',
                    section:'='
                },
                template:'&lt;ng:include src="tpl"&gt;&lt;/ng:include&gt;',
                link:function(scope,iElement,iAttrs){
                    switch(scope.section.sectionTypeId){
                        case1:
                            $http.get('partials/survey/textInput.html',{
                                cache:$templateCache
                            });
                            scope.tpl="partials/survey/textInput.html";
                            break;
                        case2:
                            $http.get('partials/survey/selectOneOption.html',{
                                cache:$templateCache
                            });
                            scope.tpl="partials/survey/selectOneOption.html";
                            break;
                        case3:
                            $http.get('partials/survey/multiSelectOption.html',{
                                cache:$templateCache
                            });
                            scope.tpl="partials/survey/multiSelectOption.html";
                            break;
                        case4:
                            $http.get('partials/survey/boolean.html',{
                                cache:$templateCache
                            });
                            scope.tpl="partials/survey/boolean.html";
                            break;
                        case5:
                            $http.get('partials/survey/multiSelectOption.html',{
                                cache:$templateCache
                            });
                            scope.tpl="partials/survey/multiSelectOption.html";
                            break;
                        case6:
                            if(scope.section.sectionId==19){
                                $http.get('partials/survey/addressSelection.html',{
                                    cache:$templateCache
                                });
                                scope.tpl="partials/survey/addressSelection.html";
                            }
                            break;
                    }
                }
            }
        }]);

最后必须说明的是,这三种方法实质上都是利用ajax来加载模板。使用ajax来实现页面分解这样的功能,相比传统的使用后台动态脚本语言的方案,必然会带来额外的开销。事实上,不光angularjs是这样,我所接触过的所有前端框架都是如此。这是浏览器端的宿命。这里所造成的负载和与后台动态脚本语言之间的优劣,只能由技术主管自己权衡。

下一篇文章将谈谈angularjs框架如何与其他类库进行协作。一些原教旨主义者认为既然使用了angularjs,那么所有的地方都得用angularjs来封装,就算被逼使用了jquery-ui,也要把使用的jquery-ui组件封装成angularjs的directives才能用。与之相反,本人是支持在angularjs的模块中写jquery代码的。一开始我也很注意能用angular的地方就不写jquery之类的代码,能用angular方法就用angular的方法。结果很明显,在添加了很多其他内容之后,一个个全用directives封装起来不现实。几十个只用一次的D3的chart,都让我封装一遍这不是自己给自己找事吗?诚然,封装起来会很好看,符合angularjs规范,但是不封装也不见得就很难维护了(我的模块拆分的很细,就算出现jquery-ui和D3的代码也很明确,从html模板的class标签上就能看出来)。

最后,推荐给大家破狼的博客,http://www.cnblogs.com/whitewolf/p/angularjs-start.html。他对angularjs研究的不错,有数次项目的经验。国内的十几个我看过的研究angularjs的博客,我第一个推荐他。(我在博客园上也注册账号了,叫张迪-西北泡面王,只评论,不发文章。发文章,这里就足够了。要是能同步就更好了。)

angularJs项目实战!02:前端的页面分解与组装的更多相关文章

  1. angularJs项目实战!01:模块划分和目录组织

    近日来我有幸主导了一个典型的web app开发.该项目从产品层次来说是个典型的CRUD应用,故而我毫不犹豫地采用了grunt + boilerplate + angularjs + bootstrap ...

  2. Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍

    本文承接上一篇:Java高级项目实战之CRM系统01:CRM系统概念和分类.企业项目开发流程 先来CRM系统结构图: 每个模块作用介绍如下: 1.营销管理 营销机会管理:针对企业中客户的质询需求所建立 ...

  3. angularJs项目实战!03:angularjs与其他类库的协作

    引言:angularjs是一个中等重量级的前端开发框架 HTML是一门很好的为静态文本设计的语言,但要构建动态的web应用它就显的乏力了.通常,我们使用以下技术来解决静态网页技术在构建动态应用上的不足 ...

  4. angularJs项目实战!03:angularjs与其他类库的协作(转)

    angularjs,在我看来是个中等重量级的框架.即不像backbone那么简单,也不像dojo和Yui那么包罗万象.很多时候,妄图包罗万象,往往会出现很多子模块的质量高不成低不就,并且修改起来较为困 ...

  5. angularJs项目实战!04:angularjs的性能问题

    上一篇文章中我花了很多口舌去介绍angularjs是一个中型框架,面对大型应用时少不了第三方类库的配合.而我的核心议题是:如何以angularjs的思路使用其他类库,这里jquery是最好的例子了,谁 ...

  6. JAVAEE——SSH项目实战02:客户列表和BaseDao封装

    作者: kent鹏 转载请注明出处: http://www.cnblogs.com/xieyupeng/p/7129152.html 该项目在SSH三大框架整合基础上进行开发:http://www.c ...

  7. 项目实战02:nginx 反向代理负载均衡、动静分离和缓存的实现

    目录 实验一:实现反向代理负载均衡且动静分离 1.环境准备: 2.下载编译安装tengine 3.设置代理服务器的配置文件 4.启动tengine服务 5.开启后端的web服务 6.测试 实验二:ng ...

  8. 项目实战02:LVS 实现负载均衡

    目录 实现基于LVS负载均衡集群的电商网站架构 实战一:LVS的NAT模式实现负载均衡 实战二:LVS的DR 模式实现负载均衡 实战三:实现80.443端口都可访问服务,且LVS实现持久连接 实验四: ...

  9. 项目实战02:LNMP的搭建、nginx的ssl加密、身份验证的实现

    目录 实战一:搭建lnmp及类小米等商业网站的实现 1.安装包,开启服务 2.修改nginx的配置文件 3.修改php-fpm的配置文件 4.运行mysql ,创建一会网页需要的库 5.把事先找好的小 ...

随机推荐

  1. C语言练习:第二大整数

    问题描述 编写一个程序,读入一组整数(不超过20个),当用户输入0时,表示输入结束.然后程序将从这组整数中,把第二大的那个整数找出来,并把它打印出来.说明:(1)0表示输入结束,它本身并不计入这组整数 ...

  2. Android Capture Android System Audio

    项目需要获取播放视频的实时音量值,最简捷的方法是监听音频输出端,取得音频输出流,再进行转换. 调查时,首先找到这篇博客: http://blog.csdn.net/jinzhuojun/article ...

  3. PHPCMS V9实现硬件地址MAC绑定访问技术实现

    目的:会员登录需要 用户名.密码.身份识别码(新增字段) 效果:  解决方法: 目前数据库中macaddress字段已经添加,修改了phpcms\modules\member\index.php 63 ...

  4. iOS app的webview注入JS遇到的坑

    webview使用JSContext 向网页js注入时时机要选为网页加载完成后即放在 -(void)webViewDidFinishLoad:(UIWebView *)webView 方法 : -(v ...

  5. Orion Network Performance Monitor 软件在网络管理中的应用

    Orion Network Performance Monitor 软件在网络管理中的应用       Orion Network Performance Monitor是完全的带宽性能和故障管理软件 ...

  6. quora 中有关angular与emberjs的精彩辩论

    原贴地址,要注册才能看,这里只有国人翻译的一部分内容 本文源自于Quora网站的一个问题,作者称最近一直在为一个新的Rails项目寻找一个JavaScript框架,通过筛选,最终纠结于Angular. ...

  7. Chocolatey的安装与使用

    @(编程) 前言 在 Linux 下,大家喜欢用 apt-get 来安装应用程序,如今在 windows 下,大家可以使用 Chocolatey 来快速下载搭建一个开发环境. Chocolatey 的 ...

  8. ubuntu 64位系统下加速Android模拟器

    安装KVM: sudo apt-get install qemu-kvm libvirt-bin ubuntu-vm-builder bridge-utils 在Postfix Configurati ...

  9. emWin(ucGui) Edit控件数值模式 ——符号编辑 worldsing

    emWin(ucGui) Edit控件数值模式出现负数值编辑时,如果键盘按键全可以设置独立的"-","+"键,这样可以正常编辑正数和负数,但是要没有设置这两个键 ...

  10. 第三次作业之Calculator项目随笔

    附:Github的链接:https://github.com/mingyueanyao/object-oriented/tree/master/Calculator 1.初见题目: 第一眼看到题目最大 ...