===== Шаблоны в директивах AngularJS ===== Очень часто в приложении нам хочется инкапсулировать кусок шаблона с какой-то логикой, для того, чтобы его потом повторно использовать. В этом нам помогут директивы с их шаблонами и линк функцией.\\ \\ Давайте для начала создадим директиву. И опишем ее Напишем link функцию и выведем в консоль fooBar, чтобы проверить, что наша директива срабатывает. Если мы посмотрим в браузер, то увидим в консоли fooBar. {{ :angular:angularjs:custom_directive:directive32.png |}} У директивы есть проперти, которое называется template. Давайте напишем template Hello world.0 app.directive('fooBar', function () { return { template: "Hello world", link: function (scope, element, attrs) { console.log('fooBar'); } }; }); В браузере мы увидим Hello world внутри нашей директивы. {{ :angular:angularjs:custom_directive:directive33.png |}} Как мы видим темплейтом является то, что написано внутри директивы.\\ Темплейты - это не просто строки. Сюда можно написать разметку, например, div. app.directive('fooBar', function () { return { template: "
Hello world
", link: function (scope, element, attrs) { console.log('fooBar'); } }; });
У нас внутри директивы отрендерился div с текстом Hello world внутри. В шаблонах можно написать любую разметку с классами и какими-то своими стилями. {{ :angular:angularjs:custom_directive:directive34.png |}} Теперь давайте попробуем добавить переменную. Для этого в link функции опишем переменную scope.name и выведем ее. app.directive('fooBar', function () { return { template: "
Hello world {{name}}
", link: function (scope, element, attrs) { console.log('fooBar'); scope.name = "Sasha"; } }; });
{{ :angular:angularjs:custom_directive:directive35.png |}} В браузере у нас вывелось Hello world Sasha. Как это работает? У нашей директивы есть scope и в нем мы создали новую переменную name. И теперь эта переменная доступна нам в этом шаблоне, так как этот шаблон привязан к нашему scope.\\ \\ Давайте сделаем что-то более сложное. Создадим массив bookmarks с обьектами внутри. app.directive('fooBar', function () { var bookmarks = [ { id: 1, name: 'AngularJS' }, { id: 2, name: 'EmberJS' }, { id: 3, name: 'ReactJS' } ]; return { template: "
Hello world {{name}}
", link: function (scope, element, attrs) { console.log('fooBar'); scope.name = "Sasha"; } }; });
Теперь давайте попробуем вывести эти значения в нашем шаблоне. Для начала нам нужно записать bookmarks в наш scope. app.directive('fooBar', function () { var bookmarks = [ { id: 1, name: 'AngularJS' }, { id: 2, name: 'EmberJS' }, { id: 3, name: 'ReactJS' } ]; return { template: "
Hello world {{name}}
", link: function (scope, element, attrs) { console.log('fooBar'); scope.name = "Sasha"; scope.myBookmarks = bookmarks; } }; });
Дальше нам нужно в шаблоне создать ng-repeat. app.directive('fooBar', function () { var bookmarks = [ { id: 1, name: 'AngularJS' }, { id: 2, name: 'EmberJS' }, { id: 3, name: 'ReactJS' } ]; return { template: "
{{bookmark.name}}
", link: function (scope, element, attrs) { console.log('fooBar'); scope.name = "Sasha"; scope.myBookmarks = bookmarks; } }; });
{{ :angular:angularjs:custom_directive:directive36.png |}} Как мы видим, на экран вывелся список наших закладок. Как так получилось? Переменная myBookmarks находится внутри scope, поэтому она доступна в шаблоне. В template мы можем писать любой html текст и angular атрибуты, например, ng-repeat, что позволяет нам выводить цикл в директиве или любые другие значения, какие мы хотим.\\ \\ В следующих уроках мы посмотрим, как усложнить шаблоны и как вынести их за пределы директивы.