angular的指令是模块化很好的一个体现,下面我将只使用指令(不用控制器),结合requirejs,实现模块化开发。

模块化关系图:

传统开发方式

<!--aaa模块-->
<div>
    <h3>this is aaa</h3>
    <input type="text" ng-model="asd">{{asd}}
    <button ng-click="submit()">submit</button>
</div>
<!--bbb模块-->
<div>
    <h3>this is bbb</h3>
    <ul>
        <li ng-repeat="el in list">{{el}}</li>
    </ul>
    <!--ccc模块-->
    <div>
        <h3>this is ccc</h3>
    </div>
</div>

把所有模块写在一起,可读性差,耦合度高,难以维护。

requires+angular模块化开发方式

index.html:

<aaa></aaa>
<bbb>
    <ccc></ccc>
</bbb>

主页面干干净净。

aaa

aaa模块包括aaa.js和aaa.html

aaa.html

<div>
    <h3>this is aaa</h3>
    <input type="text" ng-model="asd">{{asd}}
    <button ng-click="submit()">submit</button>
</div>

aaa.js(引入aaa.html,放入模板中,在link中写业务逻辑,service是用来通信的)

define(['app','text!./aaa.html'],function(app,aaa){
    app.directive("aaa", function(service) {
        return {
            restrict: 'AE',
            template: aaa,
            replace: true,
            scope:true,
            link:function(scope,element,attrs){
                scope.submit=function() {
                    service.updateName(scope.asd);
                };
            }
        }
    });
});

封装在一个文件夹里面,随时调用复用:

require(['./aaa/aaa'])即可调用aaa模块;

bbb

bbb模块也是两个文件:

bbb.html

<div>
    <h3>this is bbb</h3>
    <ul>
        <li ng-repeat="el in list">{{el}}</li>
    </ul>
    <div ng-transclude></div>
</div>

bbb.js

define(['app','text!./bbb.html'],function(app,bbb){
    app.directive('bbb',function(service){
        return{
            restrict:'AE',
            template:bbb,
            replace:'true',
            scope:true,
            transclude:true,
            link: function (scope,element,attrs) {
                scope.list=[1,2,3,4];
                scope.$on('nameUpdated', function() {
                    scope.list.push(service.name);
                });
            }
        }
    });
});

bbb可以和aaa模块通过service通信,bbb还包含ccc(通过transclude嵌入)

ccc

ccc模块也是两个文件:

ccc.html

<div>
    <h3>this is ccc</h3>
</div>

ccc.js

define(['app','text!./ccc.html'],function(app,ccc){
    app.directive('ccc',function(){
        return{
            restrict:'AE',
            template:ccc,
            replace:'true',
            scope:true,
            link: function (scope,element,attrs) {
            }
        }
    });
});

三个模块解耦后,很好维护,因为一个文件的代码量不会超过20行,而且还便于复用。可以称为组件式开发。不要小看这个例子,并非玩玩而已,而是真正的工程化开发思路!

最后一起调用(只调用了aaa,bbb,ccc已经在bbb里调用过了),并启动app:

require(['angular','./aaa/aaa','./bbb/bbb','./ccc/ccc','service'],function(angular){
        angular.bootstrap(document,['app']);
    });

最后看下总体目录:

源代码地址

Angular 结合RequireJs实现模块化开发的更多相关文章

  1. 在Html中使用Requirejs进行模块化开发

    在前端模块化的时候,不仅仅是js需要进行模块化管理,html有时候也需要模块化管理.这里就介绍下如何通过requirejs,实现html代码的模块化开发. 如何使用requirejs加载html Re ...

  2. 使用requireJs进行模块化开发

    requireJs使用 requireJs 使用require.js的第一步,是先去官方网站下载最新版本. 下载后,假定把它放在js子目录下面,就可以加载了. <script src=" ...

  3. Javascript模块化开发,使用模块化脚本加载工具RequireJS,提高你代码的速度和质量。

    随着前端JavaScript代码越来越重,如何组织JavaScript代码变得非常重要,好的组织方式,可以让别人和自己很好的理解代码,也便于维护和测试.模块化是一种非常好的代码组织方式,本文试着对Ja ...

  4. [工具配置]使用requirejs模块化开发多页面一个入口js的使用方式

    描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...

  5. 【模块化开发】------requireJS的基本使用------【巷子】

    前言 为了提高代码的复用度,开发人员会按照功能把大量的js代码分成若干文件,这样在多个页面就可以使用同一个文件了.,下面是某个网站的js引用情况 虽然代码的复用度提升了,但是缺点也体现了出来 缺点: ...

  6. 模块化开发RequireJS之shim配置

    一.shim requirejs使用AMD规范开发,若开发过程中加载非AMD规范js,需要使用requirejs的shim进行配置. shim配置语法为: //配置文件 requirejs.confi ...

  7. 使用requirejs模块化开发多页面一个入口js的使用方式

    描述 知道requirejs的都知道,每一个页面需要进行模块化开发都得有一个入口js文件进行模块配置.但是现在就有一个很尴尬的问题,如果页面很多的话,那么这个data-main对应的入口文件就会很多. ...

  8. 模块化开发(requireJS)

    模块化 在前端使用模块化开发,可以将代码根据功能实施模块的划分,每个模块功能(职责)单一,在需要更改对应的功能的时候,只需要对指定的模块进行修改,其他模块不受任何影响. 为什么要进行前端模块化? 达到 ...

  9. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

随机推荐

  1. CSS样式,雪碧,图片替换,渐变小析

    Css基础2: 相对长度单位:em,rem,px,%绝对长度单位:厘米等(不用)颜色单位:rgb,rgb的百分比,16进制(#),颜色名称字体:font-size:为了更好适合点阵,尽量使用偶数fon ...

  2. Android事件分发传递

    一.与触摸事件有关的几个方法 boolean dispatchTouchEvent(MotionEvent ev); 接收到触摸事件时,是否分发事件到下面的View 返回true:分发触摸事件 返回f ...

  3. 下载apk文件浏览器会直接打开并显示乱码的问题

    今天同事反映他的apk文件在自己的老项目中下载有问题:下载apk文件浏览器会直接打开并显示乱码,在别的项目中就没有问题. 后分析response的content-type发现,老项目的类型是text/ ...

  4. Swift 3 and OpenGL on Linux and macOS with GLFW

    https://solarianprogrammer.com/2016/11/19/swift-opengl-linux-macos-glfw/ Swift 3 and OpenGL on Linux ...

  5. HTML基础篇之视频音频

    <audio src="song.ogg" controls="controls"></audio> <!-- 兼容的音频格式og ...

  6. Hbuilder开发HTML5 APP之图标和启动页制作

    1.点击项目下的"manifest.json"文件,会出现自动化的配置工具: 2.点“图标配置“,上传制作好的图标文件,自动生成不同大小的ico,这个要赞下! 3.启动图片(spl ...

  7. Quartz 2D在ios中的使用简述一:坐标体系

    Quartz 2D是一个二维图形绘制引擎,支持iOS环境和Mac OS X环境,官方文档:Quartz 2D Programming Guide. 一.坐标体系 这样的坐标体系就导致我们使用Quart ...

  8. LB 负载均衡的层次结构

    作为后端应用的开发者,我们经常开发.调试.测试完我们的应用并发布到生产环境,用户就可以直接访问到我们的应用了.但对于互联网应用,在你的应用和用户之间还隔着一层低调的或厚或薄的负载均衡层软件,它们不显山 ...

  9. Javascript判断两个日期是否相等

    大家一定遇到过这样的情况,有两个日期对象,然后需要判断他们是否相等. 例如: var date1 = new Date("2013-11-29"); var date2 = new ...

  10. 循序渐进做项目系列(4)迷你QQ篇(2)——视频聊天!(附源码)

    一·效果展示 源码派送:MiniQQ1.1 文字聊天的实现参见:循序渐进做项目系列(3):迷你QQ篇(1)——实现客户端互相聊天 二·服务端设计 对于实现视频聊天而言,服务端最核心的工作就是要构造多媒 ...