Обновление URL в Angular JS без повторного рендеринга
Я создаю систему приборной панели в AngularJS, и у меня возникает проблема с установкой url-адреса через $location.path
в нашей панели, у нас есть куча виджетов. Каждый показывает больший развернутый вид, когда вы нажимаете на него. Мы пытаемся настроить глубокую привязку, чтобы пользователи могли ссылаться на панель мониторинга с максимальным виджетом.
в настоящее время у нас есть 2 маршрута, которые выглядят как /dashboard/:dashboardId
и /dashboard/:dashboardId/:maximizedWidgetId
когда пользователь разворачивает виджет, мы обновляем url с помощью $location.path
, но это вызывает представление для рендеринга. Поскольку у нас есть все данные, мы не хотим перезагружать весь вид, мы просто хотим обновить URL. Есть ли способ установить url-адрес, не вызывая повторного отображения представления?
HTML5Mode
установлено значение true
.
9 ответов:
фактически, представление будет отображаться каждый раз, когда вы изменяете url. Вот как $routeProvider работает в угловой, но вы можете пройти
maximizeWidgetId
как строка запроса, которая не перерисовывает представление.App.config(function($routeProvider) { $routeProvider.when('/dashboard/:dashboardId', {reloadOnSearch: false}); });
при нажатии на виджет, чтобы увеличить:
<a href="#/dashboard/1?maximizeWidgetId=1">Maximum This Widget</a> or $location.search('maximizeWidgetId', 1);
URL в адресной строке изменится на
http://app.com/dashboard/1?maximizeWidgetId=1
вы даже можете смотреть, когда поиск изменения в URL (от одного виджета к другому)
$scope.$on('$routeUpdate', function(scope, next, current) { // Minimize the current widget and maximize the new one });
вы можете установить для свойства reloadOnSearch $routeProvider значение false.
возможный дубликат вопроса:можете ли вы изменить путь без перезагрузки контроллера в AngularJS?
в отношении
для тех, кому нужно изменить полный путь() без перезагрузки контроллеров
вот плагин:https://github.com/anglibs/angular-location-update
использование:
$location.update_path('/notes/1');
мы используем угловой пользовательского интерфейса маршрутизатор вместо встроенных маршрутов для аналогичного сценария. Это не похоже на повторное создание экземпляра контроллера и повторное отображение всего представления.
Я понимаю, что это старый вопрос, но так как мне потребовалось добрых полтора дня, чтобы найти ответ, так что здесь идет.
вам не нужно преобразовывать свой путь в строки запроса если вы используете angular-ui-router.
В настоящее время, из-за чего может рассматриваться как ошибка установка
reloadOnSearch: false
в состоянии приведет к возможности изменить маршрут без перезагрузки представления. Пользователь GitHub lmessinger был даже достаточно любезен, чтобы предоставить демо. Вы можете найти ссылку из его комментария, связанного выше.в основном все, что вам нужно сделать, это:
- использовать
ui-router
вместоngRoute
- в ваших Штатах, объявить те, которые вы хотите с
reloadOnSearch: false
в моем приложении у меня есть представление списка категорий, из которого вы можете перейти в другую категорию, используя такое состояние:
$stateProvider.state('articles.list', { url: '{categorySlug}', templateUrl: 'partials/article-list.html', controller: 'ArticleListCtrl', reloadOnSearch: false });
вот именно. Надеюсь, это поможет!
Как я это реализовал:
(мое решение в основном для случаев, когда вам нужно изменить весь маршрут, а не его части)у меня есть страница с меню (menuPage) и данные не должны быть очищены на навигации (есть много входов на каждой странице, и пользователь будет очень очень недоволен, если данные исчезнут случайно).
- отключить $routeProvider
в контроллере mainPage добавьте два divs с атрибутом пользовательской директивы - каждая директива содержит только 'templateUrl ' и'scope: true'
<div ng-show="tab=='tab_name'" data-tab_name-page></div>
контроллер главной страницы содержит строки для имитации маршрутизации:
if (!$scope.tab && $location.path()) { $scope.tab = $location.path().substr(1); } $scope.setTab = function(tab) { $scope.tab = tab; $location.path('/'+tab); };
вот и все. Немного некрасиво иметь отдельную директиву для каждой страницы, но использование динамического templateUrl (как функции) в директиве провоцирует рендеринг страницы (и потерю данных входов).
Если я правильно понял ваш вопрос, вы хотите,
- развернуть виджет, когда пользователь находится на /dashboard/:dashboardId и он разворачивает виджет.
- вы хотите, чтобы пользователь имел возможность вернуться в /dashboard/:dashboardId/: maximizedWidgetId и по-прежнему видеть виджет развернутым.
вы можете настроить только первый маршрут в routerConfig и использовать RouteParams чтобы определить, передается ли развернутый виджет в params в контроллере этого настроенного маршрута и максимизируйте тот, который прошел как param. Если пользователь разворачивает его в первый раз, поделитесь url-адресом этого развернутого представления с помощью maximizedWidgetId в пользовательском интерфейсе.
пока вы используете $location (который является просто оболочкой над собственным объектом location), чтобы обновить путь, он обновит представление.
ниже код позволит вам изменить URL без перенаправления, такие как: http://localhost/#/691?фу?бар?блабла
for(var i=0;i<=1000;i++) $routeProvider.when('/'+i, {templateUrl: "tabPages/"+i+".html",reloadOnSearch: false});
но когда вы меняете на http://localhost/#/692, вы будете перенаправлены.