ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

angular-seed 路由配置详解:ngRoute 如何实现 !/view1 页面切换(含 hashPrefix 原理)

angular-seed 路由配置详解:ngRoute 如何实现 !/view1 页面切换(含 hashPrefix 原理) angular-seed 路由配置详解ngRoute 如何实现 #!/view1 页面切换含 hashPrefix 原理【免费下载链接】angular-seedSeed project for angular apps.项目地址: https://gitcode.com/gh_mirrors/an/angular-seedangular-seed 是 AngularJS 的官方种子项目通过 ngRoute 路由模块即可实现#!/view1、#!/view2这样无需刷新页面的前端路由切换。本文带你完整理解这套路由配置从 app.js 中的hashPrefix配置讲起拆解#!/view1地址是如何一步步驱动 ng-view 切换页面内容的新手也能轻松看懂。 快速上手30 秒体验路由切换先跑起来感受效果git clone https://gitcode.com/gh_mirrors/an/angular-seed cd angular-seed npm install npm start打开localhost:8000/index.html你会看到顶部两个导航链接见 index.htmlul classmenu lia href#!/view1view1/a/li lia href#!/view2view2/a/li /ul点击切换时浏览器地址栏变成#!/view1或#!/view2页面中间的 ng-view 区域内容随之变化而整个页面并不会重新加载——这就是 ngRoute 前端路由的魔力。 第一步主模块如何挂载ngRoute入口文件 app/app.js 做了三件事声明依赖myApp模块依赖ngRoute并聚合myApp.view1、myApp.view2两个路由子模块设置 hashPrefix$locationProvider.hashPrefix(!)决定 URL 中#后面带不带感叹号配置兜底路由$routeProvider.otherwise({redirectTo: /view1})表示访问任何未匹配的路径时自动跳到 view1。其中声明依赖这一步很关键因为myApp依赖了ngRoute整个应用里的路由配置$routeProvider才能生效。️ 第二步每个视图模块自注册自己的路由angular-seed 采用模块自治的组织方式每个视图文件夹里都有自己的when()路由声明view1.jswhen(/view1, { templateUrl: view1/view1.html, controller: View1Ctrl })view2.jswhen(/view2, { templateUrl: view2/view2.html, controller: View2Ctrl })每个路由配置就两个核心项配置项作用本项目示例templateUrl指定要加载的 HTML 模板view1.htmlcontroller指定接管该视图的控制器View1Ctrl比如 view2.html 里还演示了自定义 interpolate 过滤器用来把version服务注入到v%VERSION%中——这说明路由切换后新的控制器、指令、过滤器都会在ng-view内正常生效。 核心原理hashPrefix 与 #!/view1 的诞生这是很多人困惑的地方为什么地址是#!/view1而不是#/view1答案就在 app.js 这一行$locationProvider.hashPrefix(!);hashPrefix用于设置#号后面的前缀字符常见取值取值生成 URL说明!#!/view1老式 IE / jQuery 会把#!识别为 hash 变化兼容性最好本项目采用#/view1更简洁但旧浏览器可能不触发事件空字符串 HTML5 模式/view1依赖服务器重写规则刷新需后端配合为什么用 hash 路由而不是/view1真实路径零后端配置#之后的内容不会发送给服务器静态服务器如本项目的http-server无需任何 rewrite 规则直接 npm start 就能跑刷新不 404在#!/view2页面按 F5服务器只请求index.html路由状态由前端从 URL 恢复支持直接分享把xxx/index.html#!/view2发给别人打开就定位到 view2。 完整链路点击链接后发生了什么以点击view2链接为例整条链路只有 5 步用户点击 index.html 中的a href#!/view2浏览器只修改 hash不发起整页刷新ngRoute 内部监听$location的变化检测到 hash 从#!/view1变为#!/view2$location把#之后的部分解析为路由路径/view2!前缀被自动剥离ngRoute匹配 view2.js 中注册的when(/view2, ...)规则ng-view 用view2.html模板替换原有内容并实例化View2Ctrl控制器。反向操作浏览器前进/后退按钮走同样的监听逻辑所以 hash 路由天然支持浏览器历史导航。 目录结构速查路由相关的文件布局完整说明见 README.md路径职责app/app.js主模块引入 ngRoute、设置 hashPrefix、兜底路由app/index.html导航链接 ng-view视图容器app/view1/view1.js注册/view1路由与View1Ctrlapp/view2/view2.js注册/view2路由与View2Ctrlapp/core/version/version.js版本号服务演示路由切换后服务仍可用 动手练习扩展你的第一个路由照着 angular-seed 的模式加一个view3只需三步新建app/view3/目录放 view3.html 模板与注册when(/view3, ...)的view3.js在 app.js 的依赖数组中追加myApp.view3在 index.html 菜单加一个a href#!/view3链接。想改默认落地页只需把otherwise({redirectTo: /view1})里的目标换掉即可。❓ 常见疑问#!/view1和#/view1能混用吗不能。hashPrefix一旦设为!ngRoute 只按!前缀解析直接输#/view1会被当作未匹配路径触发otherwise重定向。生产环境能去掉 hash 吗可以切换到 HTML5 模式$locationProvider.html5Mode(true)但需要服务器把所有前端路径重写回index.html而 hash 路由在任何静态服务器上都开箱即用这也是 seed 项目的默认选择。路由和测试的关系每个视图都配有单元测试如 view1.spec.js路由行为还可参考 e2e-tests/scenarios.js 中的端到端场景。掌握ngRoute hashPrefix这套机制你就理解了早期单页应用URL 即状态的核心思想——现代框架的路由Vue Router、React Router本质上仍是它的升级版。【免费下载链接】angular-seedSeed project for angular apps.项目地址: https://gitcode.com/gh_mirrors/an/angular-seed创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表