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
.
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
});
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
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');
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.
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:
- Użyj
ui-router
zamiastngRoute
- 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!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).
- Wyłącz $routeProvider
-
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>
-
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); };
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,
- zmaksymalizuj widget, gdy użytkownik jest na /dashboard/: dashboardId i maksymalizuje widget.
- 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.
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.
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.
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