2014-03-31 7 views
6

Ich verwende eine Erweiterung von HashLocation, um einen Hashbang-URL-Typ für Ember.js zu implementieren. HierEmber.js deprecation of registerImplementation zugunsten von App.initializer

ist der Code-Schnipsel:

(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; 
     } 

    })); 

})(); 

ich dies nutzen, indem Sie den Router Wiedereröffnung:

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

jedoch auf die Anwendung ausgeführt wird, Ich schlage die folgende deprecation:

DEPRECATION: Using the Ember.Location.registerImplementation is no longer supported. Register your custom location implementation with the container instead. 

Ich kann keine Informationen finden, wie dies zu tun ist. Hat jemand irgendwelche Implementierungsschnipsel auf was ich tun müsste?

Antwort

9

Laut der ablehnen Nachricht. Verwenden Sie stattdessen einen Container.

(function() { 

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

var hashbangLocation = 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; 
     } 

    }); 

App.register('location:hashbang', hashbangLocation); 

})(); 

wieder öffnen wie gewohnt

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

Perfect! Genau das, was ich wollte. Vielen Dank! –

+0

Dies registriert die Implementierung in der Anwendung, nicht auf dem Container, wie die veraltete Nachricht vorschlägt. Sind das die gleichen? –