路由
1 浏览器上的URL参数控制
1.1 方法一:在Controller上设置
import Controller from '@ember/controller'; export default Controller.extend({ queryParams: ['deviceUuid'] });
1.2 方法二:在Route上设置
import Route from '@ember/routing/route'; export default Route.extend({ queryParams: { deviceUuid: { //默认情况下,ember将使用pushstate更新地址栏中的URL,以响应控制器查询参数属性的更改;如果该用replacestate,这会阻止将其他项目添加到浏览器的历史记录中 //replace: true, //触发 model 的刷新 //refreshModel: true } } });
2 Component 中使用 RouterService
import Component from '@ember/component'; export default Component.extend(ResizeAware, { routing: Ember.inject.service('-routing'), refreshCurrentRoute(){ let currentRouteName = this.get("routing.currentRouteName"); let currentRouteInstance = Ember.getOwner(this).lookup(`route:${currentRouteName}`); currentRouteInstance.refresh(); //刷新路由,但不会重新渲染页面 } });
3 不要在 application.hbs 默认路由模板中放置任何内容(教训)
ember.js 目前将 yeepolicy 的整个框架内容,包括顶部工具栏、菜单栏等都放到了 application.hbs 默认路由模板上,导致后续在这个项目上新添加的子项目都会拥有这个模板。
这导致目前我的一个需求无法实现:我想写一个纯净简单的页面,不包含任何顶部工具栏、菜单栏等,只需要放一个策略组件上去,然后在设备详情弹出的modal里嵌入一个iframe展示这个组件,iframe做了些样式调整及自动高度调整后,测试下来效果不错,因此打算采用这种方式。毕竟直接动态在modal中(非ember框架组件)添加ember组件的方式想都没敢想。
现调整路由走向:
- application->main(main模板定义目前项目整个框架内容,包括顶部工具栏、菜单栏等)
- application->segment(segment模板无内容,它的子模板是一个HTML页面,内容可以任意,放个已定义好的组件啥的都可以,如果main页面的某个地方需要(包括modal),可以直接放个iframe使用)
- application->其他子项目…
推荐方式:ember-modal-dialog 插件(路由模板、组件模板都可以用)
之前使用的是自定义的modal,还可以使用 ember-modal-dialog 插件。它的路由方式是:
To have a modal open for a specific route, just drop the {{modal-dialog}}
into that route’s template. Don’t forget to have an {{outlet}}
on the parent route.
原文:https://www.npmjs.com/package/ember-modal-dialog#live-demo-and-test-examples
模板
1 显示后台返回的 HTML 内容
当后台返回未编码的html内容后(返回格式为json),如果想使用 ember.js 的模板来直接显示,就不能用 {{myHtml}} ,必须要用 {{{myHtml}}}。
第三方插件安装
ember 官网《Managing Dependencies》一章提到安装普通NPM插件,需要先安装ember install ember-auto-import
此插件,但是我一直没有安装成功过此插件。所以一般还是在ember-cli-build.js
中添加js。地址:https://github.com/ef4/ember-auto-import。