随着Ionic App功能的不断增加,需要路由的url设置就越来越多,不喜欢在config函数中写一堆硬代码,一则不美,二则维护起来也麻烦,能不能把这些数据独立出来呢?
经过查找资料与各种实验,最终找出了可行的方案,在此记录并分享。
1.声明全局性的变量,尤其是 $stateProviderRef变量
var $stateProviderRef = null; var app = angular.module("ionicApp", ["ionic","ui.router", "ionicApp.services", "ionicApp.controllers"]);
2.config函数中设置延迟加载,并初始化变量$stateProviderRef
app.config(function($locationProvider,$stateProvider, $urlRouterProvider) { /* Url replace by dynamic load urls.json 2016.10.25 */ $urlRouterProvider.deferIntercept(); $urlRouterProvider.otherwise('tab/home'); $locationProvider.html5Mode({enabled: false}); $stateProviderRef = $stateProvider; })
3.在run函数中使用http访问json文件,加载json文件里面的url路径数据,请注意data/urls.json路径,不要写成/data/urls.json,否则真机上无法加载,此处是一坑。
app.run(function ($http, $urlRouter,$state) { $http.get("data/urls.json").success(function(data) { angular.forEach(data, function (value, key) { $stateProviderRef.state(value.name, value.value); }); /*Configures $urlRouter's listener *after* your custom listener*/ $urlRouter.sync(); $urlRouter.listen(); }); });
对应的urls.json数据内容格式为,每个项目不一样,请根据自己的情况修改对应的数据参数
[ { "name" : "tabs", "value" : { "url": "/tab", "abstract": true, "templateUrl": "templates/basic/tabs.html" } }, { "name" : "tabs.home", "value" : { "url": "/home", "views": { "home-tab": { "templateUrl": "templates/basic/home.html", "controller": "HomeController" } } } }, { "name" : "tabs.user", "value" : { "url": "/user", "views": { "user-tab": { "templateUrl": "templates/user/user.html", "controller": "UserInfoController" } } } }, { "name" : "login", "value" : { "url": "/login/:flag", "templateUrl": "templates/basic/login.html", "controller": "LoginController" } }, { "name" : "register", "value" : { "url": "/register/:flag", "templateUrl": "templates/basic/register.html", "controller": "RegisterController" } }, { "name" : "extendPage", "value" : { "url": "/extendPage/:link", "templateUrl": "templates/basic/outerHtmlFrame.html", "controller": "OuterHtmlFrameController" } } ]
然后编译打包发布apk安装测试,实现了根据json文件的配置加载路由,我的app.js文件一下子就清爽了许多。
进一步思考之后,如果我想实现类似腾讯新闻可以配置的方式,即用户自己配置关心的内容(比如娱乐,军事,财经等),那如何实现呢?
思路是在某个app的地方,用户选中了一些关心的内容,然后保存设定到一个json文件中,app启动的时候再去读取这个文件路由,就像上面的步骤一样。
此处实现的关键点是用户设置后路由马上能否生效的问题,经测试可行。
4.在按钮中设置一个按钮,事件就是将路由加载到$stateProvider变量中
$scope.addUrl = function() { var url = { "name" : "testUrl", "value" : { "url": "/testUrl", "templateUrl": "templates/basic/testUrl.html", "controller": "TestUrlController" } }; console.log("add dynamic url"); $stateProviderRef.state(url.name, url.value); };
此url事先并不在之前的urls.json文件中,此处的$stateProviderRef是第1步的全局变量。
5.在另一按钮事件中,测试是否可以马上跳转到这个testUrl.html页面
$scope.goNewUrl= function() { console.log("go dynamic url"); $state.go("testUrl"); };
编译打包apk,测试方案可以跳转到testUrl.html页面。
接下来的问题是,将默认的url内容和用户配置的url内容合并到一块customerUrs.json中,下次打开app的时候,加载这个customerUrs.json文件,而不是之前的urls.json.
如何实现在客户端的customerUrs.json的操作呢?研究中.......