Ember Force Route to Refresh Page

时间:2015-10-20 17:41:13

标签: javascript ember.js ember-cli ember-cli-addons

在我的应用程序中,我需要让我的应用程序的某些部分在转换时刷新。通过创建我调用的另一个Location类型,我已经非常接近了 passthrough然后将路由分成单独的文件。 passthrough位置选项实质上会尝试替换以前推送过历史记录状态的任何位置,而只是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
};

0 个答案:

没有答案