3

У меня есть кнопки навигации на веб-устройстве с угловым волшебством. Для косметических целей, они должны быть удалены друг от друга частичного и присоединяемых к корню «index.html»:Global back/next buttons in AngularJS

<!-- Global navigation buttons for all partials --> 
<div class="navbar navbar-fixed-top"> 
    <button class="btn btn-default" back-action>Back</button> 
    <button class="btn btn-default" next-action>Next</button> 
</div> 

<div class="container ng-view ng-cloak"> 
    <!-- Partials rendered in here, managed by $routeProvider--> 
</div> 

Я пытался изолировать эту логику с помощью директив и области видимости переменных, чтобы связать событие кликов и цели направления для каждого частичного:

.directive('nextAction', ['$location', function($location) { 
    return { 
     restrict: 'A', 
     link: function(scope, elm) { 
      elm.on('click', function() { 
       var nextUrl = scope.nextUrl; 
       $location.url(nextUrl); 
      }); 
     } 
    }; 
}]) 

URL, являются затем определены в каждом контроллере:

.controller('FirstStepCtrl', ['$scope', function ($scope) { 
     $scope.backUrl = '/'; 
     $scope.nextUrl = '/first/second'; 
     ... 

проблема в том, что scope.nextUrl является undefined поскольку область действия директивы не наследует область управления.

Наряду с тем, что в настоящее время он не работает, этот подход также кажется немного хрупким для меня, поскольку он основан на логике навигации, встроенной в код контроллера.

Как я могу создать лучшие глобальные back/next кнопки, которые динамически перенаправляются на основе текущей «страницы»?

ответ

1

Используйте диспетчер состояний для обработки обратного и следующего URL-адресов. Освободите контролеров от этой ответственности. Затем введите его в директивы, которые обрабатывают заднюю и следующую кнопки.

.factory('stateMgr', ['$rootScope', function ($rootScope) { 
    var stateMgr = { 
     backUrl: '', 
     nextUrl: '' 
    }; 

    $rootScope.$on('$routeChangeSuccess', function (nextRoute, lastRoute) { 
     // logic in here will look at nextRoute and then set back and next urls 
     // based on new route 
     // e.g. stateMgr.backUrl = '/'; stateMgr.nextUrl = '/whatever'; 
    }); 

    return stateMgr; 
}]); 

затем

.controller('FirstStepCtrl', ['$scope', function ($scope) { 
    // do not need to do anything with back/next urls in here 
    ... 

и

.directive('nextAction', ['$location', 'stateMgr', function($location, stateMgr) { 
    return { 
     restrict: 'A', 
     link: function(scope, elm) { 
      elm.on('click', function() { 
       $location.url(stateMgr.nextUrl); 
      }); 
     } 
    }; 
}]) 
+0

Спасибо за предложение Бен, этот подход действительно работает. У меня есть беспокойство, поскольку, поскольку эти переменные теперь глобальны, они могут стать устаревшими. Я должен был обеспечить, чтобы каждый контроллер установил оба URL-адреса или обнулял их, чтобы гарантировать, что пользователь не перескочил на две страницы (или на неверную страницу вообще). Возможно, есть способ очистить эти глобальные переменные между изменениями страницы? Это, по крайней мере, обеспечит, чтобы ничего не произошло, если для текущей страницы не установлены back/next globals ... – seanhodges

+0

Тогда вам нужен диспетчер состояний. Менеджер штата может отслеживать, в каком состоянии вы используете $ routeProvider, и на основе этого можно установить, что backUrl и nextUrl. Ваши контроллеры и директивы в идеале не должны нести ответственность за знание того, куда возвращаются задняя и следующая кнопки. Таким образом, менеджер штата может заменить парня на глобальном уровне и прослушать изменения маршрута, а затем настроить задний и следующий URL-адреса, или назад, а затем может быть функциями, которые вызывают, а затем проверить, какой маршрут в данный момент активен, а затем перемещаться в любом месте на основе этого. –

+0

Согласен. Инкапсулированный государственный менеджер, несомненно, будет более прост в сохранении, чем глобальное состояние. Я собираюсь отметить ваш ответ в качестве решения, поскольку он действительно фиксирует подход, о котором я говорил выше. Я с тех пор переработал свой макет, чтобы навигационные кнопки можно было добавить обратно в частичное; что делает все это намного более аккуратным, но может быть невозможно для некоторых людей. – seanhodges