ember.js - create - emberjs transitiontoroute
URL de Hashbang con Ember.js (2)
Estoy intentando configurar mi Router
para usar URL "hashbang" ( #!
).
Intenté esto, pero obviamente no funciona:
App.Router.map(function() {
this.route("index", { path: "!/" });
this.route("otherState", { path: "!/otherState" });
});
¿Es esto posible de hacer en Ember?
Extender Ember.HashLocation
sería el camino a seguir.
Para una implementación limpia, puede hacer lo siguiente.
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...
})
Luego, solicite a su Enrutador de aplicaciones que use su implementación personalizada para la administración de la ubicación:
App.Router.reopen({
location: ''hashbang''
})
La respuesta de Teddy Zeenny es en su mayoría correcta, y registerImplementation
parece ser una forma limpia de implementar esto. Intenté simplemente editar su respuesta para que respondiera completamente la pregunta, pero mi edición fue rechazada.
De todos modos aquí está el código completo para hacer que Ember use las URL hashbang:
(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;
}
}));
})();
Luego, una vez que crea su aplicación, debe cambiar el enrutador para utilizar la implementación de la ubicación "hashbang":
App.Router.reopen({
location: ''hashbang''
})