=====$routeParams в AngularJS===== Сегодня мы с вами продолжим разбираться с ngRoute, а именно, мы будем использовать routeParams. Что это такое? Когда мы, например, хотим обратиться к какому-то конкретному посту, то у нас будет использована динамическая id. Давайте попробуем. app.config(function ($routeProvider) { $routeProvider .when('/', { template: 'home.html', controller: 'homeCtrl' }) .when('/posts', { template: '

Posts for my site

' }) .when('/posts/:postId', { template: '

This is my cool post

' }) });
Если мы посмотрим в браузер и напишем #/posts/232 мы увидим, что при введении любой id у нас выводится шаблон "This is my cool post". Это очень удобно, когда у вас выводится какое-то содержимое в зависимости от введенной в url id. Именно вот это :postId обозначают, какой параметр в url будет менятся.\\ \\ Теперь давайте добавим .otherwise. .otherwise({ template: '404 no such page' }) Что такое otherwise? Это правило, которое будет срабатывать, когда ни одно из правил выше не подходит. Например, мы ввели что-то, что не ожидалось вообще. Если мы введем не существующий url, то увидим надпись 404.\\ \\ Теперь давайте заменим все шаблоны на templateUrl. app.config(function ($routeProvider) { $routeProvider .when('/', { template: 'home.html', controller: 'homeCtrl' }) .when('/posts', { template: 'posts.html' }) .when('/posts/:postId', { template: 'post.html' }) .otherwise({ template: '

404 no such page

' }) });
Создадим файлы posts.html и post.html.\\ \\ Как мы видим, templateUrl работают правильно и выводят правильные шаблоны.\\ \\ Теперь давайте добавим контроллер postCtrl. .when('/posts/:postId', { template: 'post.html', controller: 'postCtrl' }) app.controller('postCtrl', function ($scope, $routeParams) { console.log($routeParams); }); Как мы видим в браузере, routeParams - это обьект, в котором у нас есть проперти postId с значением 333. Это потому, что ngRoute предоставляет нам возможность в любом контроллере шаблона получить доступ к динамическим переменным, таким как postId. Теперь мы можем выводить в контроллере все, что относится к этому посту.\\ \\ Давайте добавим postsCtrl .when('/posts', { template: 'posts.html', controller: 'postsCtrl' }) app.controller('postsCtrl', function ($scope) { console.log('postsCtrl'); }); В браузере мы видим, что когда мы заходим на /posts, то срабатывает postsCtrl. Теперь давайте создадим фабрику, в которой будут хранится наши посты. app.factory('postsFactory', function () { return [ { id: 1, name: 'Why AngularJS is good?' }, { id: 2, name: 'I love AngularJS' }, { id: 3, name: 'Is AngularJS easy to learn?' } ]; }) Вот у нас есть 3 поста и теперь мы инджектим postsFactory. app.controller('postsCtrl', function ($scope, postsFactory) { console.log('postsCtrl', postsFactory); $scope.posts = postsFactory; }); Создаем новую переменную $scope.posts и выводим их в шаблоне.

Posts

{{post.name}}
В браузере мы видим, что у нас вывелись все три поста. При клике на пост мы переходим на конкретный пост.\\ \\ Теперь мы хотим, чтобы при клике на определенный пост у нас выводилось правильное содержимое. app.controller('postCtrl', function ($scope, $routeParams, postsFactory) { console.log($routeParams); var postId = Number($routeParams.postId); $scope.post = _.findWhere(postsFactory, { id: postId }); }); Мы заинджектили postsFactory в контроллер и находим в массиве постов нужный пост. Когда мы находим наш postId, он string, так как он берется из нашего url. Number приводит его в число, чтобы мы могли найти его правильно в массиве.\\ \\ Для поиска елементов в массиве я добавил библиотеку lodash. Мы хотим получит правильный обьект в массиве. Для этого мы используем метод lodash findWhere, который принимает массив для поиска и обьект с ключем, по которому мы будем искать.\\

{{post.name}}

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