2013-03-31 6 views
0

Интересно, как лучше всего настроить маршрут, который предназначен только для использования служебного вызова, а затем для перенаправления.Как запустить код на маршруте, который имеет доступ к службам

настоящее время я использую этот хак:

$routeProvider.when('/talks', { 
    template: '<div></div>', 
    controller: ['dateService', '$location', function(dateService, $location){ 
     var nextTalk = dateService.getNextTalkDate(); 
     $location.path('talks/' + nextTalk.format('MM') + '/' + nextTalk.format('YYYY')); 
    }] 
}); 

В настоящее время я установить конфигурацию реализации контроллера инлайн, который имеет зависимость от услуг controller, а затем делает это дело и переадресовывает.

Однако, это немного странно, так как я должен установить template в какое-то фиктивное значение, потому что иначе контроллер вообще не будет вызываться.

Чувствую, что я подчеркиваю свойство controller для чего-то, для чего он не предназначался.

Я предполагаю, что должен быть способ запустить некоторый вид несвязанного кода, который имеет доступ к службам на маршруте. Я мог бы исправить свой собственный $routeProvider. Думаю, но это кажется немного тяжелым для того, что я бы счел нужным встроить.

ответ

1

Похоже, что «/ conversations» является своего рода абстрактным, поскольку он просто используется для перенаправления на другие маршруты. . Так как о настройке маршрута, как это:

«»/переговоры /:/месяц: год»

Где: месяц и: год не является обязательным. Если месяца или года не указано, ваша служба возвращает сообщение по умолчанию. Это, вероятно, следующий разговор. Если заданы параметры, вы просто извлекаете запрошенные данные.

Таким образом, перенаправления не требуется. Теперь вы указываете контроллер и необходимый вид и выставляете свои данные в области. Возможно, было бы лучше завернуть ваш служебный вызов в обещание и разрешить его при вызове routeProviders.

Это гарантирует, что вид изменится только в том случае, если все будет исправлено.

Надеюсь, что это поможет!

+0

А, да, это звучит как жизнеспособное решение :) Спасибо – Christoph

+0

Mmmh ... кажется, нет возможности сделать параметры необязательными: http: // stackoverflow.com/a/12807157/288703 поэтому, если вы просто нажмете '/ talk', он не поймает маршрут – Christoph

+0

Хорошо, вы можете отсортировать необязательные параметры при определении нескольких маршрутов, указывающих на один и тот же контроллер. – Christoph

1

Невозможно внедрить услуги в любую точку маршрута. Будь то redirectTo или template, любой код в нем обрабатывается на уровне модуля. Это означает, что модуль загружается первым, а затем, когда приложение развернуто, тогда выполняются службы и код уровня впрыска. Таким образом, ваш лучший выбор - controller (так как это поддерживает инъекцию).

Контроллер используется во многих областях в AngularJS, и он должен отлично работать для того, что вы пытаетесь сделать. Вы можете обрабатывать перенаправление, как вы это делаете, или вы можете настроить три разных маршрута, которые указывают на один и тот же контроллер (где вы строите страницу).

var handler = { controller : 'Ctrl' }; 
$routeProvider.when('/talks', handler). 
       when('/talks/:month, handler). 
       when('/talks/:month/:year', handler); 

И если вы в конечном итоге с помощью перенаправления, а затем просто использовать $location.path(url).replace(). Это заставит стек истории вернуться на один уровень и, следовательно, URL-адрес перенаправления не будет в вашей истории.

+0

Я, вероятно, поеду с вашим решением и имею два правила, указывающие на один и тот же контроллер (это в основном похоже на необязательный параметр, как предлагал Паскаль). Я просто проверю эти параметры и перенаправляю оттуда. Спасибо за дополнительную информацию об истории. Это тоже подслушивало меня :) – Christoph

Смежные вопросы