Aktualizacja adresu URL w Angular JS bez ponownego renderowania widoku

Buduję system pulpitu nawigacyjnego w AngularJS i napotykam problem z ustawianiem adresu url przez $location.path

W naszym pulpicie nawigacyjnym mamy kilka widżetów. Każdy z nich pokazuje większy, zmaksymalizowany Widok po kliknięciu na niego. Staramy się skonfigurować Głębokie linkowanie, aby umożliwić użytkownikom łączenie się z pulpitem nawigacyjnym z widżetem zmaksymalizowanym.

Obecnie mamy 2 trasy, które wyglądają jak /dashboard/:dashboardId i /dashboard/:dashboardId/:maximizedWidgetId

Gdy użytkownik maksymalizuje widżet, aktualizujemy adres url za pomocą $location.path, ale to powoduje widok do ponownego renderowania. Ponieważ mamy wszystkie dane, nie chcemy przeładowywać całego widoku, chcemy tylko zaktualizować adres URL. Czy istnieje sposób na ustawienie adresu url bez powodowania ponownego renderowania widoku?

HTML5Mode jest ustawione na true.

Author: Dehli, 2013-08-20

9 answers

W rzeczywistości widok będzie renderowany za każdym razem, gdy zmienisz adres url. Tak działa $routeProvider w Angular, ale możesz przekazać maximizeWidgetId jako querystring, który nie renderuje ponownie widoku.

App.config(function($routeProvider) {
  $routeProvider.when('/dashboard/:dashboardId', {reloadOnSearch: false});
});

Po kliknięciu widżetu, aby zmaksymalizować:

<a href="#/dashboard/1?maximizeWidgetId=1">Maximum This Widget</a>
or
$location.search('maximizeWidgetId', 1);

Adres URL w pasku adresu zmieni się na http://app.com/dashboard/1?maximizeWidgetId=1

Możesz nawet oglądać, gdy wyszukiwanie zmienia się w adresie URL (z jednego widżetu na drugi)

$scope.$on('$routeUpdate', function(scope, next, current) {
   // Minimize the current widget and maximize the new one
});
 125
Author: codef0rmer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-01 05:12:06

Możesz ustawić właściwość reloadOnSearch $routeProvider na false.

Możliwe zduplikowane pytanie: Czy można zmienić ścieżkę bez przeładowywania kontrolera w AngularJS?

Pozdrawiam

 8
Author: bdavidxyz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:27

Dla tych, którzy potrzebują zmienić pełną ścieżkę () bez kontrolerów reload

Oto plugin: https://github.com/anglibs/angular-location-update

Użycie:

$location.update_path('/notes/1');
 6
Author: Dan Key,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-08-12 11:36:24

Dla podobnego scenariusza używamy routera Angular UI zamiast wbudowanych tras. Nie wydaje się, aby ponownie utworzyć instancję kontrolera i ponownie renderować cały widok.

 3
Author: DreamSonic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-31 18:08:13

Zdaję sobie sprawę, że to stare pytanie, ale ponieważ znalezienie odpowiedzi Zajęło mi półtora dnia, więc proszę bardzo.

Nie musisz konwertować ścieżki do ciągów zapytań , Jeśli używasz angular-ui-router.

Obecnie, ze względu na to, co Może być uznane za błąd, ustawienie reloadOnSearch: false na stanie spowoduje możliwość zmiany trasy bez przeładowywania widoku. Użytkownik GitHub lmessinger był nawet na tyle uprzejmy, że udostępnił jego demo. Można znaleźć link z jego komentarza podlinkowany powyżej.

W zasadzie wszystko, co musisz zrobić, to:

  1. Użyj ui-router zamiast ngRoute
  2. w swoich stanach deklaruj te, których pragniesz reloadOnSearch: false

W mojej aplikacji mam widok listy kategorii, z którego możesz przejść do innej kategorii za pomocą stanu takiego jak:

$stateProvider.state('articles.list', {
  url: '{categorySlug}',
    templateUrl: 'partials/article-list.html',
    controller: 'ArticleListCtrl',
    reloadOnSearch: false
  });
To wszystko. Mam nadzieję, że to pomoże!
 3
Author: ohanhi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-05 10:11:13

Jak to zaimplementowałem:
(moje rozwiązanie Głównie w przypadkach, gdy trzeba zmienić całą trasę, a nie Części podrzędne)

Mam stronę z menu (menuPage) i dane nie powinny być czyszczone w nawigacji (na każdej stronie jest dużo wejść i użytkownik będzie bardzo niezadowolony, jeśli dane znikną przypadkowo).

  1. Wyłącz $routeProvider
  2. W kontrolerze strony głównej dodaj dwa divy z atrybutem custom directive - każda dyrektywa zawiera tylko "templateUrl" i "scope: true"

     <div ng-show="tab=='tab_name'" data-tab_name-page></div>
    
  3. MainPage Controller zawiera linie do symulacji trasowania:

    if (!$scope.tab && $location.path()) {
        $scope.tab = $location.path().substr(1);
    }
    $scope.setTab = function(tab) {
        $scope.tab = tab;
        $location.path('/'+tab);
    };
    
To wszystko. Trochę brzydko mieć oddzielną dyrektywę dla każdej strony, ale użycie dynamicznego templateUrl (jako funkcji) w dyrektywie powoduje ponowne renderowanie strony (i utratę danych wejściowych).
 2
Author: OZ_,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-09-04 13:04:29

Jeśli dobrze zrozumiałem twoje pytanie, chcesz,

  1. zmaksymalizuj widget, gdy użytkownik jest na /dashboard/: dashboardId i maksymalizuje widget.
  2. chcesz, aby użytkownik miał możliwość wrócić do /dashboard/: dashboardid/: maximizedWidgetId i nadal zobaczyć widget zmaksymalizowany.

Możesz skonfigurować tylko pierwszą trasę w routerConfig i użyć RouteParams aby określić, czy maksymalny widżet jest przekazywany w params w kontrolerze ta skonfigurowana trasa i zmaksymalizuj tę, która przeszła jako param. Jeśli użytkownik maksymalizuje go za pierwszym razem, Udostępnij adres url do tego zmaksymalizowanego widoku za pomocą maksymalizedwidgetid w interfejsie użytkownika.

Dopóki używasz $location (która jest tylko opakowaniem nad natywnym obiektem lokalizacji) do aktualizacji ścieżki, odświeży to Widok.

 0
Author: Sivakumar Kailasam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-31 19:37:30

Mam pomysł na użycie

Okno.historia.replaceState('Object', 'Title', '/new-url');

Jeśli to zrobisz i dojdzie do cyklu trawienia, to całkowicie wszystko zmanipuluje. Jeśli jednak ustawisz go z powrotem na poprawny adres url, który oczekuje od angular, że jest w porządku. Więc teoretycznie możesz zapisać poprawny adres url, którego oczekuje angular i zresetować go tuż przed odpaleniem digest.

Nie testowałem tego jednak.

 0
Author: Keegan's hairstyle 82,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-21 16:42:46

Poniższy kod pozwoli Ci zmienić adres url bez przekierowania, np.: http://localhost/#/691?foo?bar?blabla

for(var i=0;i<=1000;i++) $routeProvider.when('/'+i, {templateUrl: "tabPages/"+i+".html",reloadOnSearch: false});

Ale kiedy zmienisz na http://localhost/#/692 , zostaniesz przekierowany.

 -2
Author: abc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-01-25 21:33:04