如何通过Durandal路由获取当前页面URL及URL参数?
用Durandal路由获取URL参数的解决方案
我之前在Durandal项目里刚好处理过类似的需求,完全不需要直接操作window.location.href——Durandal的路由系统已经帮我们封装好了这些能力,下面给你具体的实现步骤:
1. 在视图模型的激活方法中直接获取
Durandal的视图模型会在激活时自动接收路由定义中的参数,同时你可以通过router.activeInstruction()拿到URL里的查询参数。假设你的路由配置是sample/:moduleName,可以这样写:
define(['plugins/router'], function(router) { var viewModel = { // 激活方法会自动传入路由定义中的占位符参数(比如这里的moduleName) activate: function(moduleName) { // 你已经能获取到的模块名称 this.currentModule = moduleName; // 获取URL中的查询参数(比如token) var queryParams = router.activeInstruction().queryParams; this.token = queryParams.token; // 这里就得到了0df16b9b-73c8-45cb-83e8-7adf66ab9570 // 接下来就可以用token完成你的业务逻辑了 console.log('当前模块:', this.currentModule, 'Token:', this.token); }, currentModule: '', token: '' }; return viewModel; });
2. 全局/非激活场景下获取当前路由信息
如果需要在视图模型的其他方法或者全局位置获取当前路由及参数,直接调用router.activeInstruction()即可,它包含了所有路由相关的核心信息:
define(['plugins/router'], function(router) { function getCurrentRouteDetails() { var instruction = router.activeInstruction(); if (!instruction) return; // 获取#后面的完整路由片段(包含查询参数) var fullRouteFragment = instruction.fragment; // 结果是"sample/moduleName?token=0df16b9b-73c8-45cb-83e8-7adf66ab9570" // 获取解析后的查询参数对象 var queryParams = instruction.queryParams; // { token: "0df16b9b-73c8-45cb-83e8-7adf66ab9570" } // 获取路由参数数组(对应路由定义中的占位符) var routeParams = instruction.params; // ["moduleName"] } });
3. 确保路由配置正确
别忘了在路由映射里正确定义你的路由规则,这样Durandal才能正确解析参数:
router.map([ { route: 'sample/:moduleName', moduleId: 'path/to/your/module', title: 'Sample Module' } ]).buildNavigationModel();
这种方式比直接操作window.location更符合Durandal的设计理念,而且能自动适配路由变化的场景,避免手动解析URL带来的潜在问题。
内容的提问来源于stack exchange,提问作者Jeya Suriya Muthumari
相关产品推荐
相关产品推荐

