【问题标题】:emberjs dynamic route with hash only (no slashes)emberjs 动态路由,仅带散列(无斜杠)
【发布时间】:2013-08-29 12:37:30
【问题描述】:

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

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

仅使用哈希,而不是默认使用“/”:

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

不确定是否可行(我尝试了几次 hack 均未成功)但如果可以,请告诉我 :)

谢谢, 汤姆

【问题讨论】:

    标签: url hash ember.js routes


    【解决方案1】:

    直到 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'
    });
    

    【讨论】:

      【解决方案2】:

      @melc 感谢您为我指明正确的方向。我即兴编写了代码。注意 - 我使用的是 ember 1.5.1。

      我最终只覆盖了 getURL 方法。 registerImplementation 在 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')
      });
      
      })();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-06
        • 1970-01-01
        • 2020-01-27
        • 2019-05-22
        • 1970-01-01
        • 1970-01-01
        • 2021-09-15
        • 2015-09-07
        相关资源
        最近更新 更多