1.  路由启动          $locationProvider.html5Mode(true);  通过pushstatex修改url

app.js

  1. define([
  2. 'angular',
  3. "App/Ctrl/controllers",
  4. "App/Directive/directive",
  5.  
  6. "angularRoute"
  7. ], function (angular,controllers,directives,appDirec) {
  8. var app=angular.module('myApp', ["ngRoute",controllers.name,directives.name])
  9. templete="/front/propertyEntrust/view/templete"
  10. /* /limitSell/add?propertyId=33 */
  11.  
  12. app.config(['$routeProvider',"$locationProvider", function ($routeProvider,$locationProvider) {
  13.  
  14. $locationProvider.html5Mode(true);
  15.  
  16. $routeProvider.when('/detail/:Id', { //详情页面
  17. templateUrl: templete+'/detail.html'
  18. });
  19.  
  20. $routeProvider.when('/rent/add/:propertyId', { //一般出租
  21. templateUrl: templete+'/rent.html'
  22. });
  23.  
  24. $routeProvider.otherwise({redirectTo: '/rent'});
  25. }]);
  26.  
  27. return app
  28. });

2. 设置前端路由开始的字段 即服务器路由的最后的字段

  1. <base href="/fy/propertyEntrustApply/index/">

  

小注:angular在此处使用html5的base标签来做baseurl的配置,而不是提供API 配置baseurl 非常巧妙,充分利用了html5  base标签的特性。  debug  所有$0.href   发现都自动加上了了“/client.app/index”.

这样在模板 或者.routeprovider 配置路由的时候就不需要在另外拼装上baseurl了。节省了很多对url逻辑的处理。 但是 如果是script加载脚本 相对路径的话 可能会与base的配置冲突,我的项目使用requirejs一类的包加载器解决问题

3,后端配置重定向  nodejs为例

  1. app.get('/fy/propertyEntrustApply/index/*', function (req, res) {
  2. res.render("a", {});
  3. });

如上所示     http://localhost:3000/fy/propertyEntrustApply/index/rent/add/21

/fy/propertyEntrustApply/index/  为服务器路由  指向a.ejs

之后/rent/add/21  就是前端路由了

源码小解:

对路由监听路由其实是监听rootscope,  loaction.path()的修改会自动更新rootscope,所以对location.path()的作用其实类似backbone的navigate(), 逻辑是手动走了路由随后更改url的值,而不是相反。

其次 angular对视图内的所有超链接做了事件代理

  1. $rootElement.on('click', function(event) {
  2. // TODO(vojta): rewrite link when opening in new tab/window (in legacy browser)
  3. // currently we open nice url link and redirect then
  4.  
  5. if (event.ctrlKey || event.metaKey || event.which == 2) return;
  6.  
  7. var elm = jqLite(event.target);
  8.  
  9. // traverse the DOM up to find first A tag
  10. while (lowercase(elm[0].nodeName) !== 'a') {
  11. // ignore rewriting if no A tag (reached root element, or no parent - removed from document)
  12. if (elm[0] === $rootElement[0] || !(elm = elm.parent())[0]) return;
  13. }
  14.  
  15. var absHref = elm.prop('href');
  16.  
  17. if (isObject(absHref) && absHref.toString() === '[object SVGAnimatedString]') {
  18. // SVGAnimatedString.animVal should be identical to SVGAnimatedString.baseVal, unless during
  19. // an animation.
  20. absHref = urlResolve(absHref.animVal).href;
  21. }
  22.  
  23. var rewrittenUrl = $location.$$rewrite(absHref);
  24.  
  25. if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
  26. event.preventDefault();
  27. if (rewrittenUrl != $browser.url()) {
  28. // update location manually
  29. $location.$$parse(rewrittenUrl);
  30. $rootScope.$apply();
  31. // hack to work around FF6 bug 684208 when scenario runner clicks on links
  32. window.angular['ff-684208-preventDefault'] = true;
  33. }
  34. }
  35. });

 可以看到, 点击超链接的默认行为被禁止,如果超链接是负责路由跳转的时候,获得路由的url, 手动执行$rootScope.$apply();

注意$().prop  与$().attr()的区别  主要在$().attr() 拿的是$0.href, $().prop拿的是$0.getAttribute("href") , 此处需要去除 base路径的拼装,只拿前端路由。所以使用$().prop

  1. $rootScope.$watch(function $locationWatch() {
  2. var oldUrl = $browser.url();
  3. var currentReplace = $location.$$replace;
  4.  
  5. if (!changeCounter || oldUrl != $location.absUrl()) {
  6. changeCounter++;
  7. $rootScope.$evalAsync(function() {
  8. if ($rootScope.$broadcast('$locationChangeStart', $location.absUrl(), oldUrl).
  9. defaultPrevented) {
  10. $location.$$parse(oldUrl);
  11. } else {
  12. $browser.url($location.absUrl(), currentReplace);
  13. afterLocationChange(oldUrl);
  14. }
  15. });
  16. }
  17. $location.$$replace = false;
  18.  
  19. return changeCounter;
  20. });

angular 会watch rootscope,当rootscope更新的时候 $browser.url()  H5模式启用的条件下  调用pushstate 修改浏览器 url的值,最后afterLocationChange(oldUrl),广播 $locationChangeSuccess 事件。

然后在 angular-rout.js  ngroute模块中会监听$locationChangeSuccess 事件,执行路由模块的逻辑。

  1. $rootScope.$on('$locationChangeSuccess', updateRoute);

  

angular 路由去除#号的更多相关文章

  1. angular路由——ui.route

    angular路由 使用案例 <!DOCTYPE html> <html lang="en"> <head> <meta charset= ...

  2. angular路由详解:

    1.$routeProvider ngRoute模块中的服务 2.otherwise:设置用于路由改变时,与任何其他定义的路由无法匹配的时候执行的代码 3.when:为$route服务定义新的路由 例 ...

  3. angular 路由的引用

    使用angular路由 遇到的坑. 使用cmd 安装好node.js 安装成功 输入node  -v 能查看版本说明安装成功 搭建angular项目输入命令 npm install  -g  angu ...

  4. angular 路由项目例子

    angular 路由是我在工作中体验非常便捷的一点, 这是详细的API ,查看API 可以了解很多东西, https://github.com/angular-ui/ui-router/wiki/Qu ...

  5. Angular路由参数传递

    一.路由时传递参数的方式 1.在查询参数中传递数据 //页面 <a routerLink="/product" [queryParams]="{id:1}" ...

  6. angular路由(自带路由篇)

    一.angular路由是什么? 为了实现SPA多视图的切换的效果,其原理可简述为每个 URL 都有对应的视图和控制器.所以当我们给url后面拼上不同的参数就能通过路由实现不同视图的切换. 二.文件总览 ...

  7. Angular路由守卫 canActivate

    作用 canActivate 控制是否允许进入路由. canActivateChild 等同 canActivate,只不过针对是所有子路由. 关键代码 创建路由守卫 import { Injecta ...

  8. Angular路由守卫 canDeactivate

    目的 离开页面时,做出逻辑判断 以ng-alain的项目为基础做演示 效果如图: 关键代码 定义一个CanDeactivateGuardService export class CanDeactiva ...

  9. Angular 路由守卫

    1. 路由 Angular路由: 可以控制页面跳转:可以在多视图间切换: 2. 路由守卫 Angular路由守卫: 在进入或离开某路由时,用于判断是否可以离开.进入某路由::: return true ...

随机推荐

  1. json日期格式问题的办法

    //json日期转换 格式(2015-01-01) <input class="easyui-datebox" name="sbdj_txtShebaoka_Lin ...

  2. python 代码片段18

    #coding=utf-8 f=open('text.txt','w') f.write('foo\n') f.write('bar\n') f.close() f=open('test.txt',' ...

  3. Shell 脚本

    近期在别人的工作基础上完善了几个shell自动安装脚本. 1. 循环远程访问机器并安装 #!/bin/bash IpPrefix=. User=root Pwd= SMNIP=52.1.123.79 ...

  4. 20145304 Java第九周学习报告

    20145304<Java程序设计>第九周学习总结 教材学习内容总结 JDBC简介 JDBC全名Java DataBase Connectivity,是Java联机数据库的标准规范.定义了 ...

  5. CODEVS 1817 灾后重建 Label:Floyd || 最短瓶颈路

    描述 灾后重建(rebuild)  B地区在地震过后,所有村庄都造成了一定的损毁,而这场地震却没对公路造成什么影响.但是在村庄重建好之前,所有与未重建完成的村庄的公路均无法通车.换句话说,只有连接着两 ...

  6. 转:JavaScript中的this陷阱的最全收集

    在其他地方看到的,觉得解释的狠详细,特此分享 当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概念,可能真解释不清 ...

  7. NOI 题库 2753

    2753  走迷宫 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走.给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直 ...

  8. NOIP 2012 Day2T2 借教室题解

    NOIP 2012 Day2T2 借教室题解 题目传送门:http://codevs.cn/problem/1217/ 题目描述 Description 在大学期间,经常需要租借教室.大到院系举办活动 ...

  9. CentOS 6.5/6.6 安装mysql 5.7 最完整版教程

    Step1: 检测系统是否自带安装mysql # yum list installed | grep mysql Step2: 删除系统自带的mysql及其依赖命令: # yum -y remove ...

  10. 关于web前端(知乎上收集)

    1988年的图灵奖得主Ivan Sutherland就是搞人机交互的,事情跟现在的前端是一个路子. 微博上@_Franky: 这和司机一个道理. 开车也是易学难精的.基本个把月就能上路. 而需要赛车手 ...