使用Ember.js的Hashbang URL

使用Ember.js的Hashbang URL,ember.js,ember-router,hashbang,Ember.js,Ember Router,Hashbang,我正在尝试将我的路由器设置为使用“hashbang”URL(#!) 我试过这个,但显然不起作用: App.Router.map(function() { this.route("index", { path: "!/" }); this.route("otherState", { path: "!/otherState" }); }); 在Ember中可以这样做吗?扩展Ember。HashLocation将是一种方法 对于干净的实现,您可以执行以下操作 Ember.Locati

我正在尝试将我的
路由器设置为使用“hashbang”URL(
#!

我试过这个,但显然不起作用:

App.Router.map(function() {
    this.route("index", { path: "!/" });
    this.route("otherState", { path: "!/otherState" });
});

在Ember中可以这样做吗?

扩展
Ember。HashLocation
将是一种方法

对于干净的实现,您可以执行以下操作

Ember.Location.registerImplementation('hashbang', Ember.HashLocation.extend({
  // overwrite what you need, for example:
  formatURL: function(url) {
    return '#!' + url;
  }
  // you'll also need to overwrite setURL, getURL, onUpdateURL...
})
然后指示您的应用路由器使用您的自定义实现进行位置管理:

App.Router.reopen({
  location: 'hashbang'
})

Teddy Zeenny的答案基本上是正确的,
registerImplementation
似乎是实现这一点的干净方法。我试图编辑他的答案,使其完全回答问题,但我的编辑被拒绝

无论如何,下面是让Ember使用hashbang URL的完整代码:

(function() {

var get = Ember.get, set = Ember.set;

Ember.Location.registerImplementation('hashbang', Ember.HashLocation.extend({ 

    getURL: function() {
        return get(this, 'location').hash.substr(2);
    },

    setURL: function(path) {
        get(this, 'location').hash = "!"+path;
        set(this, 'lastSetURL', "!"+path);
    },

    onUpdateURL: function(callback) {
        var self = this;
        var guid = Ember.guidFor(this);

        Ember.$(window).bind('hashchange.ember-location-'+guid, function() {
                Ember.run(function() {
                    var path = location.hash.substr(2);
                    if (get(self, 'lastSetURL') === path) { return; }

                    set(self, 'lastSetURL', null);

                    callback(location.hash.substr(2));
                });
        });
    },

    formatURL: function(url) {
        return '#!'+url;
    }

}));

})();
然后,创建应用程序后,您需要更改路由器以利用“hashbang”位置实现:

App.Router.reopen({
    location: 'hashbang'
})

我通过覆盖
Ember.HashLocation
属性添加一些“!”来实现这一点这是几根弦。我不完全确定这是否会破坏任何东西。如果没有人发布一个更合法的方法来做这件事,我会添加我的代码作为答案。好答案。我没有在我的解决方案中使用
registerImplementation
。这肯定会让它更干净。我编辑了您的答案,以包含完整的代码来完成这项工作,因为除了
formatURL
中的更改之外,还需要进行其他一些更改,因为某些原因,我对您答案的编辑被拒绝。不知道交易是什么。无论如何,我刚刚发布了我自己的答案和代码,以完全实现hashbang URL功能。很好,只需几句评论:-最好重新打开
App.Router
,而不是
Ember.Router
(所以你要保持Ember默认值干净,尤其是在测试时)-您不需要覆盖
init
willDestroy
,因为您正在扩展HashLocation,这些函数将被继承,代码将更简单。谢谢。我改变了你说的。这个方法非常有效,但在最后一次余烬中抛出了一条不赞成的消息;如果不使用不推荐的代码,我们该怎么做呢?万一有人不知道,谷歌也可以抓取使用HTML5 pushState而不是hash-bang方法的网站。这是马的嘴:这是使用它的灰烬文件: