Как вызвать функцию в AngularJs при совпадении маршрута?

$routeProvider.when('/ticket', {
    controller: TicketController, 
    templateUrl: Routing.generate('ticket_list')
});

отображает простой список, в котором можно выбрать каждую запись. Однако при выборе дополнительный вид не загружается. Все в ticket_lost template. В шаблоне есть несколько скрытых полей, которые открываются при нажатии на запись.

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

selectedTicket = 1;

Итак, когда есть такой маршрут, как

/ticket/1

Я хочу вызвать функцию, которая устанавливает для selectedTicket значение 1. Возможно ли это? Как это сделать? Что мне нужно изменить в маршрутизации?


person Upvote    schedule 05.05.2013    source источник
comment
Не могли бы вы предоставить дополнительную информацию о своем приложении - вы имеете в виду элементы, которые не были объяснены в вашем вопросе - возможно, также можно было бы предоставить plunkr или fiddle?   -  person callmekatootie    schedule 05.05.2013


Ответы (1)


Взгляните на службу $routeParams. Это позволяет настроить маршрут с параметрами, которые будут обрабатываться сервисом:

// Given:
// URL: http://server.com/index.html#/ticket/1
// Route: /ticket/:ticketId
//
// Then
$routeParams ==> {ticketId:1}

В вашем контроллере:

angular.module('myApp')
    .config(['$routeProvider', function($routeProvider) {
        $routeProvider.when('/ticket', {controller: 'TicketController'});
        $routeProvider.when('/ticket/:ticketId', {controller: 'TicketController'});
        $routeProvider.otherwise({redirectTo: '/ticket'});
    }])
    .controller('TicketController', function ($scope, $routeParams) {
        var init = function () {
            if ($routeParams.ticketId) {
                $scope.ticketSelected($routeParams.ticketId);
            }
        };

        // fire on controller loaded
        init();
    });
person Dmitry Evseev    schedule 05.05.2013
comment
И как мне заставить мой маршрут / билет работать с параметром ticketId и без него? - person Upvote; 05.05.2013
comment
Он должен работать с двумя маршрутами, которые используют один и тот же контроллер, один с параметром :ticketId, один без - person Narretz; 05.05.2013
comment
Да, послушайте @Narretz: вам понадобится 2 маршрута. Обновлен ответ - person Dmitry Evseev; 05.05.2013
comment
@ Дмитрий Евсеев, это лучший способ определить правильный метод для вызова при изменении URL-адреса, нет ли лучшего способа? Вы просто проверяете, существует ли ticketId в $routeParams, что, если у меня много URL-адресов с ticketIds? - person Emeka Mbah; 17.08.2015
comment
@Digitlimit, если у вас много URL-адресов с одинаковым именем параметра tickerId, но с разной логикой, вам лучше иметь для них отдельные контроллеры. Один контроллер со слишком большим количеством логики будет сложнее поддерживать, масштабировать и тестировать. - person Dmitry Evseev; 17.08.2015
comment
@Дмитрий Евсеев Да, ты прав. Я думаю, что с этим github.com/angular-ui/ui-router он будет будь проще - person Emeka Mbah; 17.08.2015