2013-02-18 18 views
15

Próbuję skonfigurować mój Router, aby używać adresów URL "hashbang" (#!).Adresy URL Hashbang za pomocą Ember.js

próbowałem tego, ale oczywiście to nie działa:

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

Czy jest to możliwe do zrobienia w Ember?

+0

Udało mi się to zrobić poprzez nadpisanie właściwości 'Ember.HashLocation' w celu dodania niektórych"! "Do kilku ciągów. Nie jestem do końca pewien, czy to coś zepsuje. Jeśli nikt nie publikuje bardziej uzasadnionego sposobu, dodam mój kod jako odpowiedź. – twiz

Odpowiedz

10

Poszerzenie Ember.HashLocation będzie drogą do zrobienia.

W celu przeprowadzenia czystej implementacji można wykonać następujące czynności.

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... 
}) 

Następnie poinstruować App Router do korzystania z wdrożenia niestandardowego dla zarządzania lokalizacji: odpowiedź

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

Dobra odpowiedź. Nie użyłem "registerImplementation" w rozwiązaniu, które miałem. To zdecydowanie sprawia, że ​​jest czystszy. Edytowałem twoją odpowiedź, aby dołączyć pełny kod, aby to zadziałało, ponieważ jest kilka innych zmian, które muszą być wprowadzone inne niż w 'formatURL' – twiz

+0

Z jakiegoś powodu moja edycja twojej odpowiedzi została odrzucona. Nie jestem pewien, co to za umowa. W każdym razie właśnie wysłałem własną odpowiedź z kodem, aby w pełni zaimplementować funkcję adresu URL hashbang. – twiz

19

Teddy Zeenny jest w większości poprawne, a registerImplementation wydaje się być czysty sposób zaimplementować to. Próbowałem po prostu edytować jego odpowiedź, aby w pełni odpowiedzieć na pytanie, ale moja edycja została odrzucona.

Zresztą tutaj jest pełny kod aby Ember użycie 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; 
    } 

})); 

})(); 

Następnie po utworzeniu aplikację trzeba zmienić router, aby wykorzystać „hashbang” Wdrożenie lokalizacji:

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

Świetnie, tylko kilka komentarzy: - Lepiej ponownie otworzyć 'App.Router' zamiast' Ember.Router' (A więc utrzymujesz domyślne wartości embera, zwłaszcza jeśli testujesz) - Nie musisz nadpisywać ' init' i 'willDestroy', ponieważ rozszerzasz HashLocation, funkcje te będą dziedziczone, a kod będzie prostszy. –

+0

Dzięki. Zmieniłem to, co powiedziałeś. – twiz

+2

Ta metoda działa doskonale, ale w ostatniej ember rzuca komunikat o wycofaniu; co musimy zrobić, aby użyć tego bez użycia przestarzałego kodu? –

Powiązane problemy