前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【Hybrid开发高级系列】AngularJS(三)——开发实践

【Hybrid开发高级系列】AngularJS(三)——开发实践

作者头像
江中散人_Jun
发布2023-10-16 12:26:25
2360
发布2023-10-16 12:26:25
举报
文章被收录于专栏:云原生布道专栏

1 开发实践

AngularJS体验式编程系列文章

http://blog.fens.me/series-angular/

AngularJS实战

http://www.imooc.com/learn/156

1.1 工程搭建

AngularJS从构建项目开始

http://blog.fens.me/angularjs-yeoman-project/

1.1.1 使用Yeoman自动生成工程

Yeoman官方教程:用Yeoman和AngularJS做Web应用

http://blog.jobbole.com/65399/

1.1.1.1 Yeoman安装

        在安装Yeoman之前,你需要确认以下配置:

Node.js版本在0.10以上

npm版本在1.3.7以上

        安装好Node之后,你就可以用命令行来安装Yeoman了。 注意:大部分情况下Yeoman是要通过命令行来操作的,不同的系统执行以下命令的地方不太一样:Mac下请使用终端,Linux下使用shell,Windows下使用Cygwin

$ npm install--global yo

        如果你看到了’permission errors’或者’access errors’,你需要在这条命令前面加上’sudo’。通过

$ yo  --version && bower --version && grunt --version

        命令来检查是不是所有东西都已经安装好了。在执行完上述命令后,你应该会看到有四个版本号会被打印出来:

    • Yeoman

    • Bower

    • Grunt

    • GruntCLI(Grunt的命令行界面)

        适用本教程的Yeoman, Bower和Grunt版本

    安装Yeoman生成器

        在传统的Web开发流程中,你可能会花很多时间在配置代码模板、下载依赖还有手动组件项目文件结构上。而Yeoman就是来简化这个流程的!前面说的那些繁重的工作都会被交给Yeoman来完成。让我们来试试用Yeoman来创建一个AngularJS项目吧! 用下面这行命令进入Yeoman的菜单:

$ yo

        用键盘的上下键来操作菜单,当选项’install agenerator’被高亮的时候按下回车键。 接下来我们需要寻找一个合适的生成器。搜索’angular’的话,你会得到很多搜索结果。这些生成器都是由许多Yeoman开源社区贡献的。在这个例子里,我们使用的是’generator-angular’。当选中了’generator-angular’后,按下回车执行安装,它所依赖的Node包就会开始被下载了。

        如果你知道要安装的生成器的名字,你可以直接用npm来安装:

$ npm install -g generator-angular

        下面是一张预览图:

        这个例子使用的generator-angular版本,或者你可以直接安装0.7.1这个版本:

$ npm install-g generator-angular@0.7.1

1.1.1.2 使用生成器搭建你的应用

        你可以在Yeoman的菜单中操作已经安装好的生成器:

$ yo

        等一下!不要直接就运行生成器了。重新创建一个新的项目目录,生成器会在这个目录下生成出你的项目文件的。

$ mkdir mytodo

$ cd mytodo

        执行’yo’,选中’Run the Angular generator’,运行生成器。当你比较熟悉Yo的时候,就可以不通过菜单直接运行生成器:

$ yo angular

        一些生成器也会提供一些有共同开发库(common developerlibraries)的可选配置来定制你的应用,能够加速初始化你的开发环境。 generator-angular会询问你需不需要使用Sass和/或者Bootstrap,使用’n'和’y'进行选择。

        然后你需要选择你需要使用的Angular模块。Angular模块是一些带有特定功能的独立的JS文件。举个例子,ngResource模块(angular-resource.js)提供了RESTful服务。你可以使用空格键来取消项目。下面来看一看默认值。(当你在试用空格的效果时,确保所有的模块都被标记为绿色)

        好的,现在按下回车键。Yeoman将会自动构建你的应用、拉取需要的依赖并在你的工作流中创建一些有帮助的Grunt任务(GruntTasks)。几分钟后,我们就能正式开始啦!

1.1.1.3 由Yeoman构建的文件目录结构

        打开’mytodo’目录,你会看到下面的文件结构:

app/:Web应用的父级目录。

    index.html:Angular应用的基准HTML文件(base htmlfile)

    404.html、favicon.ico和robots.txt:通用的Web文件,Yeoman已经将它创建出来了,你不需要再手动去创建

    bower_components:存放项目相关的JavaScript或Web依赖,由bower安装的

    scripts:我们的JS文件

        app.js:主程序

        controllers:Angular控制器

    styles:我们的CSS文件

    views:Angular模板

Gruntfile.js、package.json 以及node_modules:Grunt需要使用的依赖以及配置。

test和karma.conf.js/karma-e2e.conf.js:测试框架以及针对这个项目的单元测试,包括了为控制器写的样板测试(boilerplatetests)。

1.2 架构设计技巧

1.2.2 请求Service层
1.2.3 数据模型层
1.2.4 业务逻辑层
1.2.5 界面表现层

1.3 代码开发技巧

1.3.1 跨html跳转到某一个业务模块

$window.location.href = 'registerIndex.html#/userInfoInput';

var registerModule = angular.module("registerModule", ['ui.router', 'hj-User', 'hj-Message', 'ngAnimate', 'hj-Loadding']).config(function(

                        $urlRouterProvider.otherwise("mobileInput");   

                        $stateProvider.state('mobileInput',{

                                                                        url: '/mobileInput',

                                                                        templateUrl: 'registerStep1.html',

                                                                        controller: 'sendMsgCtr'

                                                            }).state('vrfMsg',{

                                                                        url: '/vrfMsg',

                                                                        templateUrl: 'registerStep2.html',

                                                                        controller: 'vrfMsgCtr'

                                                            }).state('userInfoInput', {

                                                                        url: '/userInfoInput',

                                                                        templateUrl: 'registerStep3.html',

                                                                        controller: 'userInfoInputCtr'

                                                            }).state('passwordInput',{

                                                                        url: '/passwordInput',

                                                                        templateUrl: 'registerStep4.html',

                                                                        controller: 'passwordInputCtr'

                                                            });

});

原理解析:

        其实AngularJS的页面内的内容切换,也是基于html的锚点机制来实现的,不同锚点对应显示不同html部分的内容。

1.3.2 页面回退

        下面方法不好用,不如直接用history对象操作简单:

window.history.back();

window.history.go(-1);

在angularJS中实现返回前一页

http://blog.csdn.net/qianqianyixiao1/article/details/51146519

AngularJs返回前一页面时刷新一次前面页面

http://blog.csdn.net/ywl570717586/article/details/50505536

html

<script src="lib/angular/angular-1.4.9/angular.js"></script>

<script src="lib/angular/angular-ui-router.min.js"></script>

app

   angular.module('ConsoleUIApp', ['ui.router','ui.bootstrap'])

       .config(function (stateProvider, urlRouterProvider,

            // For any unmatched url, redirect to /state1

           $urlRouterProvider.otherwise("/home");

           $stateProvider

               .state('home', {

                   url: "/home",

                   templateUrl: "views/home.html",

                    controller: 'HomeCtrl'

                })

               .state('testing', {

                   url: "/testing",

                   templateUrl: "views/testing.html",

                   controller: 'TestingCtrl'

                })

        })

       .run(function(rootScope, growl, state,

rootScope.state =

rootScope.stateParams =

rootScope.on("

                //to be used for back button won't work when page is reloaded.

               $rootScope.previousState_name = fromState.name;

               $rootScope.previousState_params = fromParams;

            });

            //back button function called from back button's ng-click="back()"

            $rootScope.back = function() {//实现返回的函数

state.go(rootScope.previousState_name,

          };

        });

controller:

     $scope.sub =function(addRode) {

     $rootScope.back()//直接使用

     }

https://github.com/angular-ui/ui-router/issues/92

1.3.3 路由变化监控

AngularJS中locationchange、routechange事件

http://blog.csdn.net/spy19881201/article/details/17096675

[javascript]AngularJS-需要routeChangeStart和locationChangeStart的一些组合

http://www.itstrike.cn/Question/f341de90-c2ae-4d71-b0e6-c547c92fb4bf.html

1.3.4 路由拦截与重定向

        路由拦截的原理在于监听stateChangeStart或者locationChangeStart事件,在此事件中对即将跳转的路由状态进行拦截解析并做重定向处理。

//    function(event, toState, toParams, fromState, fromParams)

rootScope.on('

        var toState = arguments[1];

        var toParams = arguments[2];

        var fromState = arguments[3];

        var fromParams = arguments[4];

        if(toState.name =="myIndexNoOn"){

            if(hj.UserUtil.checkLoginStatus())

            {

                $state.go("infoIndexOn");

            }

        }

        else{

            //This will load the current route first (ie: '/home'), and then

            //redirect the user to the correct 'login' route.

        }

    });

1.3.5 页面Loading生命周期事件

    View Load Events视图加载事件

viewContentLoading- 当视图开始加载,DOM渲染完成之前触发,该事件将在scope链上广播此事件。

scope.on('

    // Access to all the view config properties.

    // and one special property 'targetView'

    // viewConfig.targetView 

});

    • viewContentLoaded-当视图加载完成,DOM渲染完成之后触发,视图所在的scope发出该事件。

scope.on('

scope.watch('

1.3.6 依赖注入的顺序与方法参数的引用属性必须保持一致

        如上图就是错误写法,这样会导致构造方法入参类型是错的!!!

    原因分析:

        AngularJS中注入依赖,本质上也是根据类名去寻找对应类的代码逻辑地址,如果有多个对象注入,在初始化方法中,必须是按照注入顺序传递进来,因为JS是无类型的,切记切记。

1.3.7 Service的Factory声明方式使用

AngularJS中service,factory,provider的区别

http://my.oschina.net/tanweijie/blog/295067

简介AngularJS中使用factory和service的方法

http://www.xker.com/page/e2015/06/199141.html

使用Factory创建复制数据对象单例:

assetIndex.factory("assetData", function($rootScope, hjFundService) {

   var assetObj = {

        totalAsset : '----',

        yestodayProfit : '----',

        totalProfit : '----',

        zqAsset : '----',

        fundAsset : '----',

        highAsset : '----',

        mpData : {},

        mpSize : 0,

        mpIndexUrl : '../account/mpIndex.html'

    };

    assetObj.reloadAssetData = function(callback, callbackError){

        //数值在页面失去焦点后被释放了,在此重新获取一次,保险一点

        var hjUserId = hj.UserUtil.getCmfUserId();

        if(!hjUserId) return;

        var promise = hjFundService.queryTotalAsset({

            userId: hjUserId

        });

        promise.then(function(data) {

            assetObj.totalAsset = data.totalAsset;

        }, function(e) {

            assetObj.totalAsset = '----';

        });

        ……

        promise = hjFundService.queryMyMpList({

            userId: hjUserId

        });

        promise.then(function(data) {

            assetObj.mpData = data;

            assetObj.mpSize =data.mpList.length;

            assetObj.mpIndexUrl ='../account/mpIndex.html';

            if(callback)

            {

                callback();

            }

        }, function(e) {

            assetObj.mpSize = 0;

            if(callbackError)

            {

                callbackError();

            }

        });

    };

    return assetObj;

});

1.3.8 图片轮播代码
1.3.9 控件查询

var scrollObj = document.querySelector('.fundVoteLists');

1.3.10 登录退转后,回退到页面,页面事件响应失效问题

    问题:

        从购买页面做重定向到登录页,再从登录页登录成功回到购买页面,购买页面的事件响应失效。

    原因分析:

        在controller加载时,碰到登录失效时,虽然要跳转到登录页,但是当前runloop周期内,还是应该继续执行剩余代码,因为事件绑定逻辑都要执行完,不然页面回退回来,就会发现事件无法响应。

2 参考链接

2.1 AngularJS基础

整理AngularJS中的一些常用指令

http://www.xker.com/page/e2015/06/198575.html

AngularJS移动开发中的坑汇总

http://blog.csdn.net/offbye/article/details/38490821?utm_source=tuicool&utm_medium=referral

25个超有用的AngularJS Web开发工具

http://www.chinaz.com/web/2015/0703/419434.shtml

AngularJS最理想开发工具WebStorm

http://blog.fens.me/angularjs-webstorm-ide/

angular通过$http与服务器通信

http://blog.csdn.net/yangnianbing110/article/details/43124679

AngularJS-常用服务

http://www.2cto.com/kf/201504/388774.html

第九讲 Angularjs常用服务http location cacheFactory log

http://www.phonegap100.com/article-416-1.html

简介AngularJS中$http服务的用法

http://www.jb51.net/article/79243.htm

AngularJS中使用路由和$location切换视图

http://www.thinksaas.cn/group/topic/348590/

angularjs通过锚链接实现页面切换的问题

https://segmentfault.com/q/1010000002949626

走进AngularJs(二)ng模板中常用指令的使用方式-吕大豹

http://www.tuicool.com/articles/jIV7rm

React vs Angular 2:战争继续

http://ouvens.github.io/article-translation/2016/04/07/react-vs-angular2-fight-rages-on.html?utm_source=tuicool&utm_medium=referral

急急急!高手请帮忙!angule js中ng-view中使用了ng-include,如何实现ng-include的这个页面刷新,外部的ng-view不刷新

http://www.oschina.net/question/2356458_233962

ng-include用法分析以及多标签页面的简单实现方式

http://my.oschina.net/keysITer/blog/630621?p=1

深入理解ng里的scope

http://get.ftqq.com/462.get

angularJs前端的页面分解与组装

http://hudeyong926.iteye.com/blog/2111664

2.2 Angular route

AngularJS -路由入门

http://www.linuxidc.com/Linux/2015-02/113532.htm

[javascript] AngularJS-需要routeChangeStart和locationChangeStart的一些组合

http://www.itstrike.cn/Question/f341de90-c2ae-4d71-b0e6-c547c92fb4bf.html

AngularJs ng-route路由详解

http://www.w2bc.com/article/95434

AngularJS ui-router (嵌套路由)

http://www.open-open.com/lib/view/open1416878937309.html

AngularJS使用UI Router实现表单向导

http://www.oschina.net/translate/angularjs-multi-step-form-using-ui-router

Angular监听路由变化事件

http://my.oschina.net/jack088/blog/479466

http://stackoverflow.com/questions/23585065/angularjs-ui-router-change-url-without-reloading-state

http://stackoverflow.com/questions/21309366/angularjs-ui-router-state-go-only-changing-url-in-address-bar-but-not-loa

AngularJS中locationchange、routechange事件

http://blog.csdn.net/spy19881201/article/details/17096675

2.3 Data binding

AngularJs双向绑定机制解析

http://www.2cto.com/kf/201408/327594.html

双向数据绑定---AngularJS的基本原理学习

http://www.tuicool.com/articles/vENni2Y

解析angularjs中的三种数据绑定策略

http://www.2cto.com/kf/201504/391807.html

七步从Angular.JS菜鸟到专家(3):数据绑定和AJAX

http://blog.jobbole.com/48780/

双向数据绑定---AngularJS的基本原理学习

http://www.tuicool.com/articles/vENni2Y

AngularJS中数据双向绑定(two-way data-binding)

http://www.cnblogs.com/Leo_wl/p/3715030.html

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-10-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1 开发实践
    • 1.1 工程搭建
      • 1.1.1 使用Yeoman自动生成工程
    • 1.2 架构设计技巧
      • 1.2.2 请求Service层
      • 1.2.3 数据模型层
      • 1.2.4 业务逻辑层
      • 1.2.5 界面表现层
    • 1.3 代码开发技巧
      • 1.3.1 跨html跳转到某一个业务模块
      • 1.3.2 页面回退
      • 1.3.3 路由变化监控
      • 1.3.4 路由拦截与重定向
      • 1.3.5 页面Loading生命周期事件
      • 1.3.6 依赖注入的顺序与方法参数的引用属性必须保持一致
      • 1.3.7 Service的Factory声明方式使用
      • 1.3.8 图片轮播代码
      • 1.3.9 控件查询
      • 1.3.10 登录退转后,回退到页面,页面事件响应失效问题
  • 2 参考链接
    • 2.1 AngularJS基础
      • 2.2 Angular route
        • 2.3 Data binding
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档