2013-05-02 7 views
8

będę chodzić po problematycznym przepływu ...Jak miksować łącza, które powodują odświeżanie strony, z Angular's html5Mode = true bez łamania przycisku Wstecz?

  • załadować google.com (tylko jako punkt wyjścia)
  • I goto app.com
  • I NAV app.com/projects
  • I nAV app.com/api/test (poprzez window.location)
  • I zobacz surowe JSON (jak na razie dobre ...)
  • Wycofuję zmiany adresu URL na app.com/projects, ale wciąż widzę JSON.
  • Ponownie naciskam, adres URL zmienia się na app.com, ale nadal widzę JSON.
  • Ponownie naciskasz, obciążenia google.com. porządku ... wszystko z powrotem do normalnego

Co dziwne, to ja obserwuje ten

  • pędzę do przodu, app.com ładuje tylko gdy html5Mode = true w Webkit- firefox działa zgodnie z oczekiwaniami ..

    . . .

    Po pierwsze, moja server.coffee wygląda następująco:

    app.get '/partials/:partial', routes.partials 
    app.get '/api/test', api.test 
    app.get '*', routes.index 
    

    Zasadniczo wszystkie żądania załadować indeks (który bootstraps kątowe), z wyjątkiem na widok/częściowej obsługi i trasy testu API który odpowiada surowym JSON.

    . . .

    (używam moduł ui-router zarządzania zagnieżdżone poglądy i UI stwierdza, że ​​używa $urlRouterProvider, która jest bardzo podobna do kątowego za $routeProvider)

    drugie, moja app.coffee wygląda następująco:

    app = angular.module('app', ['ui-router']) 
    .config([ 
        '$stateProvider' 
        '$locationProvider' 
        '$urlRouterProvider' 
        ($stateProvider, $locationProvider, $urlRouterProvider)-> 
         $urlRouterProvider 
          .when('/api/test', [ 
           '$window' 
           '$location' 
           ($window, $location)-> 
            $window.location.href = '/api/test' 
          ]) 
          .otherwise('/') 
         $stateProvider 
          .state 'home', 
           url: '/' 
           templateUrl: 'partials/index' 
           controller: 'IndexCtrl' 
          .state 'projects', 
           url: '/projects' 
           templateUrl: 'partials/projects' 
           controller: 'ProjectsCtrl' 
         $locationProvider.html5Mode(true).hashPrefix '!' 
    ]) 
    

    Ponieważ wszystko jest asynchroniczne, musiałem użyć $window, aby uzyskać dostęp do window.location.href, aby uruchomić odświeżanie strony, aby serwer mógł obsłużyć trasę.

    Moje pytanie, czy mogę łączyć linki, które powodują odświeżanie strony z Angular's html5Mode bez przerywania przycisku wstecz? Czy to tylko błąd Webkita i czy jest lepszy sposób na zrobienie tego?

    Idealnie sprawiłbym, że aplikacja przestała działać Angular, ale rzeczy takie jak strona "o" lub "kontakt" (które nie muszą być dynamiczne ani asynchroniczne), byłyby podawane bezpośrednio z serwera przy użyciu zwykłej strony odświeża ...

    Pomoc!

  • +1

    Teraz mam odpowiedź, znalazłem duplikat pytanie: http://stackoverflow.com/questions/11580004/angular-js-link-behaviour-disable-deep-linking-for-specific-urls – jlmakes

    Odpowiedz

    18

    dwie opcje:

    1. Jeśli używasz <a /> tagów określić target="_self" pozwolić angularjs wiedzieć, że nie należy uchwycić ich kliknięcia (te linki będą obsługiwane przez przeglądarkę normalnie). To nie jest hack; jest to normalne udokumentowane zachowanie.
    2. Użyj $window.location = 'foo', tak jak robiłeś. Jest to dopuszczalne.
    +4

    +1 dla opcji 1, która naprawia przycisk Wstecz w webkicie za pomocą 'html5Mode = true'; Zdecydowanie tęskniłem za tym w dokumentacji, dzięki Ezekiel! – jlmakes

    +0

    Działa rozwiązanie Victora. Ustawienie target="_self" wymusza przeładowanie strony, a nie tylko routing. –

    +0

    Dzięki! Zdecydowanie uratuj mi życie! –

    Powiązane problemy