仅具有哈希的emberjs动态路由(无斜杠)

时间:2013-08-29 12:37:30

标签: url hash ember.js routes

即使所有内容都在标题中,要清楚,我希望我的emberjs 动态路线看起来像:

http://mywebsite.com/#dynamic_route/subroute

仅使用哈希,而不是默认使用'/'的那个:

http://mywebsite.com/#/dynamic_route/subroute

不确定是否可能(我尝试了几次没有成功的黑客)但如果是,请告诉我:)

谢谢, 汤姆

2 个答案:

答案 0 :(得分:0)

最高版本1.0.0-pre.4这似乎是默认行为。在最终版本1.0.0中,对于没有路径的路由,它的行为类似。我已经遵循并且似乎工作正常的方法是通过提供位置API(http://emberjs.com/guides/routing/specifying-the-location-api/)的实现,并且它基于在中讨论的默认实现, https://github.com/emberjs/ember.js/issues/2053answersHashbang URLs using Ember.js

(function() {

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

    Ember.Location.registerImplementation('no-slashes', Ember.HashLocation.extend({   
        getURL: function() {
            var path = get(this, 'location').hash;
            if(path.indexOf("/")!=1){
                return "/"+path.substr(1);
            }else{
                return path.substr(1);  
            }
        },

        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(1);
                    if(path.indexOf("/")!=0){
                        path = "/"+path;
                    }
                    if (get(self, 'lastSetURL') === path) { return; }
                    set(self, 'lastSetURL', null);
                    callback(path);
                });
            });
        }

    }));

})();
App.Router.reopen({
    location: 'no-slashes'
});

答案 1 :(得分:0)

@melc感谢你指点我正确的方向。我即兴创作了代码。注意 - 我正在使用ember 1.5.1。

我最终只覆盖了getURL方法。 register.1mplementation在1.5.1中已弃用,因此使用容器注册HashLocation的新实现。希望这有助于某人。

(function() {

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

var noSlashLocation = Ember.HashLocation.extend({
    getURL: function() {
        var hash = this.getHash().substr(1);
        return (hash.indexOf('/') != 0) ? '/'+hash : hash;            
    }
});

var container = new Ember.Container();
container.register('location:no-slash', noSlashLocation);

Ember.Router.reopen({
    location: container.lookup('location:no-slash')
});

})();