在我的应用程序中,我需要在转换时对应用程序的某些部分进行硬刷新。Location
通过创建另一种我调用
的类型passthrough
,然后将路由分离到一个单独的文件中,我已经非常接近了。passthrough
location 选项本质上是尝试替换之前推送历史状态的任何位置,而只是替换新location.href =
的pathname
. 我现在遇到的问题是,尽管这或多或少有效,但路由器已经触发了运行循环,并且视图在刷新之前会呈现一瞬间。不太熟悉如何控制运行循环,所以认为也许有人可以提供帮助。
/location/passthrough.js
import Ember from 'ember';
/* Implement history API that hard refreshes on transition */
export default Ember.Object.extend({
implementation: 'passthrough',
rootURL: '/',
init() {
this.set('location', this.get('location') || window.location);
this.set('baseURL', Ember.$('base').attr('href') || '');
},
setURL(path) {
this.get('location').href = path;
},
replaceURL(path) {
this.get('location').href = path;
},
getURL() {
var rootURL = this.get('rootURL');
var location = this.get('location');
var path = location.pathname;
var baseURL = this.get('baseURL');
rootURL = rootURL.replace(/\/$/, '');
baseURL = baseURL.replace(/\/$/, '');
var url = path.replace(baseURL, '').replace(rootURL, '');
var search = location.search || '';
url += search;
url += this.getHash();
return url;
},
onUpdateURL() {
if (this.get('location').pathname === this.getURL()) {
return;
}
window.location.href = this.getURL();
},
formatURL(url) {
return url;
},
getHash: Ember.Location._getHash
});
/initializers/location.js
import PassThroughLocation from '../location/passthrough';
export function initialize(instance) {
instance.register('location:passthrough', PassThroughLocation);
}
export default {
name: 'location',
initialize: initialize
};
然后在我的路由器中location:'passthrough'
设置。
我这样做的部分理由是对于某些页面,我想包含其他模块并设置单独的 CSP。基本上,当您点击/secure/path
服务器端时,会在标头中设置更严格的 CSP,并加载一些仅在网站的这一部分中使用的模块。
更新:
覆盖link-to
组件的行为似乎是可能的,尽管非常亲密。
import Ember from 'ember';
export function initialize() {
Ember.LinkComponent.reopen({
_invoke: function (event) {
window.location.href = event.target.pathname;
return false;
}
});
}
export default {
name: 'location',
initialize: initialize
};