AngularJS + RequireJS 进行项目架构

AngularJS + RequireJS 进行项目架构

目录结构

project
--css
    --index.css
    --reset.css
    --swiper.css
    --...
--imgs
    -- home
    -- market
    -- cart
    -- mine
    --home_normal.png
    --home_selected.png
    --...
-- json
    --data.json
    --home.json
-- scripts
    -- libs
    -- controllers
        -- home
            --home.js
         -- market
            --market.js
         -- cart
            --cart.js
         -- mine
            --mine.js
         -- common
            --header.js
         --app.js
         --menu.js
     -- views
        -- home
            --home.html
        -- market
            --market.html
        -- cart
            --cart.html
        -- mine
            --mine.html
            --orderForm.html
        --swiper.html
     -- css
        -- home
            --home.css
        -- market
            --market.css
        -- cart
            --cart.css
        -- mine
            --mine.css
        -- common
            --header.css
     -- routes
        --appRouter.js
     -- services
        --dataServices.js
     -- directives
        --swiperDirectives.js
     --main.js
--index.html

关键代码解释

项目首页 index.html

主文件,引入主模块,引入重置样式表,引入对应的css文件

如果首页有tabbar区域,则写在此区域内

<!DOCTYPE html>
<html>
    <head>
        <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
        <meta charset="utf-8">
        <title></title>
        <link rel="stylesheet" href="css/reset.css">
        <link rel="stylesheet" href="css/index.css">
    </head>
    <body ng-cloak>

        <div class="menu" ng-controller="MenuCtrl" ng-show="displayMenu">
            <section ng-repeat="(i, item) in menuData" ng-click="changeMenuIndex()">
                <a ui-sref="{{ item.router }}">
                    ![]({{ (i == currentIndex) ? item.selectImg : item.normalImg }})
                    <p>{{ item.title }}</p>
                </a>
            </section>
        </div>

        <div class="container" ui-view></div>
    </body>
    <script type="text/javascript">
        !function(n) {
           var e = n.document,
               t = e.documentElement,
               i = 720,
               d = i / 100,
               o = "orientationchange" in n ? "orientationchange" : "resize",
               a = function() {
                   var n = t.clientWidth || 375;
                   n > 720 && (n = 720), t.style.fontSize = n / d + "px"
               };
           e.addEventListener && (n.addEventListener(o, a, !1), e.addEventListener("DOMContentLoaded", a, !1))
        }(window);
    </script>
    <script src="scripts/libs/require.js" data-main="scripts/main" charset="utf-8"></script>
</html>

主模块 main.js

requirejs的主模块,所有的配置都在这里

加载angularjs,并且加载所有的控制器、自定义指令、服务等等

requirejs.config({
    baseUrl: './scripts',
    paths: {
        angular: 'libs/angular',
        'angular-ui-router': 'libs/angular-ui-router',
        swiper: 'libs/swiper',
        domReady: 'libs/domReady',


        app: 'controllers/app',
        menuCtrl: 'controllers/menu',
        homeCtrl: 'controllers/home/home',
        marketCtrl: 'controllers/market/market',
        cartCtrl: 'controllers/cart/cart',
        mineCtrl: 'controllers/mine/mine',
        orderForm: 'controllers/mine/orderForm',

        router: 'routes/appRouter',

        swiperDirective: 'directives/swiperDirective',
        dataService: 'services/dataService',
        goHome: 'services/goHome'
    },
    shim: {
        angular: {
            exports: 'angular'
        },
        'angular-ui-router': {
            deps: ['angular']
        }
    }
});


// 引入主模块,对应各自文件
requirejs([
    'angular', 'domReady', 'angular-ui-router',
    'app', 'router',
    'menuCtrl', 'homeCtrl', 'marketCtrl', 'cartCtrl', 'mineCtrl', 'orderForm',
    'swiperDirective',
    'dataService', 'goHome',
], function (angular, domReady, _, app) {

    // 页面加载完毕
    domReady(function () {
        // 动态绑定ng-app指令
        // 注意中括号中字符串需要与app.js中一致
        angular.bootstrap(document, ['axfApp']);

        location.hash = '';
    });
});

返回App app.js

返回代表angularjs程序的app变量,为了其它文件的使用

define(['angular'], function (angular) {
    var app = angular.module('axfApp', ['ui.router']);
    return app;
});

路由配置 appRouter.js

路由文件,所有的路由配置都写在这里

define(['app'], function (app) {
    app.config(['$stateProvider', '$urlRouterProvider', function ($stateProvider, $urlRouterProvider) {
        // 默认路由
        $urlRouterProvider.when('', 'home');
        // 全部路由
        $stateProvider
        .state('home', {
            url: '/home',
            templateUrl: 'scripts/views/home/home.html',
            controller: 'HomeCtrl'
        })
        .state('market', {
            url: '/market',
            templateUrl: 'scripts/views/market/market.html',
            controller: 'MarketCtrl'
        })
        .state('cart', {
            url: '/cart',
            templateUrl: 'scripts/views/cart/cart.html',
            controller: 'CartCtrl'
        })
        .state('mine', {
            url: '/mine',
            templateUrl: 'scripts/views/mine/mine.html',
            controller: 'MineCtrl'
        })
        .state('orderForm', {
            url: '/orderForm:index',
            templateUrl: 'scripts/views/mine/orderForm.html',
            controller: 'OrderFormCtrl'
        })
    }]);
});

控制器示例 home.js

define(['app'], function (app) {
    app.controller('HomeCtrl', ['$scope', '$http', function ($scope, $http) {
        // 获取数据
        $http.get('json/home.json').then(function (res) {
            // 全部数据
            $scope.allData = res.data.data;

            // 轮播图
            $scope.swiper = $scope.allData.act_info[0];

            // 每次必抢 鲜货直供 新人专享 整箱购
            $scope.menu = $scope.allData.act_info[1];
            $scope.bianlidian = $scope.allData.act_info[4].act_rows;

            // 最下面的一组数据
            $scope.goods = $scope.allData.act_info[5].act_rows;
        });
    }])
});

模板页面示例 home.html

<link rel="stylesheet" href="scripts/css/home/home.css">
<div class="home">
    <div class="header" ng-include="'scripts/views/common/header.html'"></div>
    <swiper-directive ng-style="{ marginTop: '52px' }"></swiper-directive>
    <ul class="acts-category">
        <li ng-repeat="item in goods">
            <div class="top">
                <span class="title" ng-style="{ borderColor:  '{{'#' + item.category_detail.category_color }}', color: '{{'#' + item.category_detail.category_color }}' }">{{ item.category_detail.name }}</span>
                <span class="more">更多</span>
            </div>
            <div class="img">
                ![]({{ item.activity.img }})
            </div>
            <ul class="goods-list clear">
                <li ng-repeat="good in item.category_detail.goods">
                    <div class="good-img">
                        ![]({{ good.img }})
                    </div>
                    <p class="good-name">{{ good.name }}</p>
                    <p>
                        <span class="jingxuan">精选</span>
                        <span class="sale" ng-if="good.pm_desc">{{ good.pm_desc }}</span>
                    </p>
                    <p class="weight">{{ good.specifics }}</p>
                    <p>
                        <span class="price">¥{{ good.price }}</span>
                        <span class="market-price" ng-if="good.price != good.market_price">¥{{ good.market_price }}</span>
                    </p>
                    <div class="btn">
                        <span></span>
                    </div>
                </li>
            </ul>
        </li>
    </ul>
</div>

样式示例 home.css

.home {
    height: 100%;
    overflow-y: auto;
}
.home .acts-category {
    background-color: RGBA(239, 239, 239, 1.00);
    padding-top: 10px;
    padding-bottom: 1.0384615384615385rem;
}
...

自定义指令 swiperDirective.js

define(['app', 'swiper'], function (app, Swiper) {
    app.controller('SwiperCtrl', ['$scope', '$http', function ($scope, $http) {
        console.log('SwiperCtrl');
        $http.get('http://www.vrserver.applinzi.com/aixianfeng/apihome.php').then(function (res) {
            $scope.slide = res.data.data.slide;
        });
    }]);

    app.directive('swiperDirective', function () {
        return {
            restrict: "ECMA",
            replace: true,
            templateUrl: 'scripts/views/swiper.html',
            controller: 'SwiperCtrl',
            link: function (scope) {
                // 让轮播图自动滚动
                // scope.$watch('slide', function () {
                    new Swiper ('.swiper-container', {
                        loop: true,
                        autoplay: 1000,
                        observer: true,

                        // 如果需要分页器
                        pagination: '.swiper-pagination',
                    })
                // });
            }
        };
    })
});

服务示例 dataService.js

define(['app'], function (app) {
    app.service('dataService', function () {
        // 存放购物车的数据
        var goods = [];

        // 添加商品
        this.addGood = function (item) {
            var flag = false;
            // 判断是否存在
            goods.map(function (g) {
                if (g.id == item.id) { // 存在
                    flag = true; // 标记存在
                    return;
                }
            });
            // 不存在才会添加
            flag == false && goods.push(item);
        };

        // 数量减少
        this.reduceCount = function (item) {
            goods.map(function (g, i) {
                if (g.id == item.id) { // 找到了
                    // 数字不是1
                    if (g.count != 0) {
                        // 赋值操作
                        g = item;
                    } else {
                        // 删除元素
                        goods.splice(i, 1);
                    }
                }
            });
        };

        // 根据id,获取详情
        this.goodDetail = function (index) {
            return goods[index];
        };

        // 全部数据
        this.allGoods = function () {
            // return Object.create(goods);
            return goods;
        };
    });
});
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,825评论 4 377
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,887评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,425评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,801评论 0 224
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,252评论 3 299
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,089评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,216评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 31,005评论 0 215
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,747评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,883评论 2 255
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,354评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,694评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,406评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,222评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,242评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,017评论 2 281

推荐阅读更多精彩内容