随着Ionic App功能的不断增加,需要路由的url设置就越来越多,不喜欢在config函数中写一堆硬代码,一则不美,二则维护起来也麻烦,能不能把这些数据独立出来呢?

经过查找资料与各种实验,最终找出了可行的方案,在此记录并分享。

1.声明全局性的变量,尤其是 $stateProviderRef变量

  1. var $stateProviderRef = null;
  2.  
  3. var app = angular.module("ionicApp", ["ionic","ui.router", "ionicApp.services", "ionicApp.controllers"]);

2.config函数中设置延迟加载,并初始化变量$stateProviderRef

  1. app.config(function($locationProvider,$stateProvider, $urlRouterProvider)
  2. {
  3. /*
  4. Url replace by dynamic load urls.json 2016.10.25
  5. */
  6. $urlRouterProvider.deferIntercept();
  7. $urlRouterProvider.otherwise('tab/home');
  8. $locationProvider.html5Mode({enabled: false});
  9. $stateProviderRef = $stateProvider;
  10.  
  11. })

3.在run函数中使用http访问json文件,加载json文件里面的url路径数据,请注意data/urls.json路径,不要写成/data/urls.json,否则真机上无法加载,此处是一坑。

  1. app.run(function ($http, $urlRouter,$state)
  2. {
  3. $http.get("data/urls.json").success(function(data)
  4. {
  5. angular.forEach(data, function (value, key)
  6. {
  7. $stateProviderRef.state(value.name, value.value);
  8. });
  9. /*Configures $urlRouter's listener *after* your custom listener*/
  10. $urlRouter.sync();
  11. $urlRouter.listen();
  12. });
  13. });

对应的urls.json数据内容格式为,每个项目不一样,请根据自己的情况修改对应的数据参数

  1. [
  2. {
  3. "name" : "tabs",
  4. "value" : {
  5. "url": "/tab",
  6. "abstract": true,
  7. "templateUrl": "templates/basic/tabs.html"
  8. }
  9. },
  10. {
  11. "name" : "tabs.home",
  12. "value" : {
  13. "url": "/home",
  14. "views": {
  15. "home-tab": {
  16. "templateUrl": "templates/basic/home.html",
  17. "controller": "HomeController"
  18. }
  19. }
  20. }
  21. },
  22. {
  23. "name" : "tabs.user",
  24. "value" : {
  25. "url": "/user",
  26. "views": {
  27. "user-tab": {
  28. "templateUrl": "templates/user/user.html",
  29. "controller": "UserInfoController"
  30. }
  31. }
  32. }
  33. },
  34. {
  35. "name" : "login",
  36. "value" : {
  37. "url": "/login/:flag",
  38. "templateUrl": "templates/basic/login.html",
  39. "controller": "LoginController"
  40. }
  41. },
  42. {
  43. "name" : "register",
  44. "value" : {
  45. "url": "/register/:flag",
  46. "templateUrl": "templates/basic/register.html",
  47. "controller": "RegisterController"
  48. }
  49. },
  50. {
  51. "name" : "extendPage",
  52. "value" : {
  53. "url": "/extendPage/:link",
  54. "templateUrl": "templates/basic/outerHtmlFrame.html",
  55. "controller": "OuterHtmlFrameController"
  56. }
  57. }
  58. ]

然后编译打包发布apk安装测试,实现了根据json文件的配置加载路由,我的app.js文件一下子就清爽了许多。

进一步思考之后,如果我想实现类似腾讯新闻可以配置的方式,即用户自己配置关心的内容(比如娱乐,军事,财经等),那如何实现呢?

思路是在某个app的地方,用户选中了一些关心的内容,然后保存设定到一个json文件中,app启动的时候再去读取这个文件路由,就像上面的步骤一样。

此处实现的关键点是用户设置后路由马上能否生效的问题,经测试可行。

4.在按钮中设置一个按钮,事件就是将路由加载到$stateProvider变量中

  1. $scope.addUrl = function()
  2. {
  3. var url = {
  4. "name" : "testUrl",
  5. "value" : {
  6. "url": "/testUrl",
  7. "templateUrl": "templates/basic/testUrl.html",
  8. "controller": "TestUrlController"
  9. }
  10. };
  11. console.log("add dynamic url");
  12. $stateProviderRef.state(url.name, url.value);
  13. };

此url事先并不在之前的urls.json文件中,此处的$stateProviderRef是第1步的全局变量。

5.在另一按钮事件中,测试是否可以马上跳转到这个testUrl.html页面

  1. $scope.goNewUrl= function()
  2. {
  3. console.log("go dynamic url");
  4. $state.go("testUrl");
  5. };

编译打包apk,测试方案可以跳转到testUrl.html页面。

接下来的问题是,将默认的url内容和用户配置的url内容合并到一块customerUrs.json中,下次打开app的时候,加载这个customerUrs.json文件,而不是之前的urls.json.

如何实现在客户端的customerUrs.json的操作呢?研究中.......

Ionic 动态配置url路由的设置的更多相关文章

  1. spring security实现动态配置url权限的两种方法

    缘起 标准的RABC, 权限需要支持动态配置,spring security默认是在代码里约定好权限,真实的业务场景通常需要可以支持动态配置角色访问权限,即在运行时去配置url对应的访问角色. 基于s ...

  2. Spring Security之动态配置资源权限

    在Spring Security中实现通过数据库动态配置url资源权限,需要通过配置验证过滤器来实现资源权限的加载.验证.系统启动时,到数据库加载系统资源权限列表,当有请求访问时,通过对比系统资源权限 ...

  3. Azure Application Gateway (3) 设置URL路由

    <Windows Azure Platform 系列文章目录> 在之前的文章中,笔者介绍了Azure Web App可以设置URL路由.如下图: 在这里笔者简单介绍一下,首先我们还是创建以 ...

  4. django中url路由配置及渲染方式

    今天我们学习如何配置url.如何传参.如何命名.以及渲染的方式,内容大致有以下几个方面. 创建视图函数并访问 创建app django中url规则 捕获参数 路径转换器 正则表达式 额外参数 渲染方式 ...

  5. Django学习手册 - 正则URL路由配置/路由分发

    ############################################### 总结: 一.url路由配置: 方式一:(通过url链接get获取) 方式二:(url路由匹配方式获取-拓 ...

  6. Django 02 url路由配置及渲染方式

    Django 02 url路由配置及渲染方式 一.URL #URL #(Uniform Resoure Locator) 统一资源定位符:对可以从互联网上得到的资源的位置和访问方法的一种简洁的表示,是 ...

  7. 2016/5/6 thinkphp ①框架 ② 框架项目部署 ③MVC模式 ④控制器访问及路由解析 ⑤开发和生产模式 ⑥控制器和对应方法创建 ⑦视图模板文件创建 ⑧url地址大小写设置 ⑨空操作空控制器 ⑩项目分组

    真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格不一样) 项目稳 ...

  8. Django——2 路由分配设置 re_path正则匹配 include总路由 url传参 name使用 模板渲染render方法 模板渲染方法

    Django 路由分配设置 re_path正则匹配 include总路由设置 url额外参数的传递 name的使用 模板的渲染:render方法   路由的分配中, 可以设定相应的转换器加以约束,比如 ...

  9. Django入门--url路由基本配置

    URL(Uniform Resoure Locater)统一资源定位符,是对可以从互联网上得到资源位置和访问方法的一种简洁形式,是互联网上标准资源的地址.互联网上的每个文件都有一个唯一的URL,它包含 ...

随机推荐

  1. SG Input 软件安全分析之逆向分析

    前言 通过本文介绍怎么对一个 windows 程序进行安全分析.分析的软件版本为 2018-10-9 , 所有相关文件的链接 链接:https://pan.baidu.com/s/1l6BuuL-HP ...

  2. engineecms——工程师知识管理系统,带文档协作和状态和流程

    工程师们工作的平台,需要对图纸资料按工程项目名称,按工程项目阶段,按参与设计的专业等来分放. 而设计成果需要进行校审,才能算最终成果,也就是要具备状态和流程功能,这个一般网盘资源存储是做不到的. 一些 ...

  3. Android常用数据类型转换

    String转int.float.double.byte[].bitmap Int i = Integer.parseInt(str); Float f = Float.parseFloat(str) ...

  4. Flume Channel Selector

    Flume 基于Channel Selector可以实现扇入.扇出. 同一个数据源分发到不同的目的,如下图. 在source上可以定义channel selector: 1 2 3 4 5 6 7 8 ...

  5. svn下已add文件如何忽略

    正如官方指南所言:TortoiseSVN → Unversion and add to ignore list,取消版本控制并添加至忽略列表. http://www.cnblogs.com/huang ...

  6. WCF服务端开发和客户端引用小结

    1.服务端开发 1.1 WCF服务创建方式 创建一个WCF服务,总是会创建一个服务接口和一个服务接口实现.通常根据服务宿主的不同,有两种创建方式. (1)创建WCF应用程序 通过创建WCF服务应用程序 ...

  7. ccf题库中2015年12月2号消除类游戏

    题目如下: 问题描述 消除类游戏是深受大众欢迎的一种游戏,游戏在一个包含有n行m列的游戏棋盘上进行,棋盘的每一行每一列的方格上放着一个有颜色的棋子,当一行或一列上有连续三个或更多的相同颜色的棋子时,这 ...

  8. iOS时间显示今天昨天

    一.前言 今天无意间想起写这个功能,仔细考虑了一下,其实很简单,整体思路如下: 先获取你所要转换的时间的年月日,然后再获取今天和昨天的年月日,然后对比,进而返回不同的字符串. 二.实现步骤 首先,我们 ...

  9. asp.net core 如何集成kindeditor并实现图片上传功能

     准备工作 1.visual studio 2015 update3开发环境 2.net core 1.0.1 及以上版本  目录 新建asp.net core web项目 下载kindeditor ...

  10. system函数的应用

    system函数的两个简单应用 1.调用cmd命令.例:(打开计算器) #include <stdlib.h> int main() { system("calc"); ...