Инструменты пользователя

Инструменты сайта


angular:angularjs:custom_directive:templates

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
angular:angularjs:custom_directive:templates [2020/06/17 10:36]
werwolf
angular:angularjs:custom_directive:templates [2023/01/12 12:18] (текущий)
Строка 1: Строка 1:
-===== Шаблоны директив =====+===== Шаблоны ​в директивах AngularJS ​=====
  
-В прошлых темах мы рассмотрели создание директив, в которых применялось API jqLite с использованием метода //​angular.element()//​ и т.д. Но есть альтернативный подход, ​который заключается в использовании шаблонов. Функциональность шаблонов построена ​вокруг свойства**template**.\\ +Очень часто в приложении нам хочется инкапсулировать кусок шаблона с какой-то логикой, для ​того, чтобы его ​потом повторно использовать. В этом ​нам помогут директивы ​с их шаблонами и линк ​функцией.\\ 
-Используем шаблоны в директиве:+\\ 
 +Давайте для начала создадим директиву. 
 +<code javascript>​ 
 +    <​foo-bar></​foo-bar>​ 
 +</​code>​ 
 +И опишем ее 
 +<code javascript>​ 
 +    <​foo-bar></​foo-bar>​ 
 +</​code>​ 
 + 
 +Напишем link функцию и выведем в консоль fooBar, чтобы проверить, что наша директива срабатывает. Если мы посмотрим в браузер, то увидим в консоли fooBar. 
 + 
 +{{ :angular:​angularjs:​custom_directive:​directive32.png |}} 
 + 
 +У директивы есть проперти, которое ​называется template. Давайте напишем template Hello world.0
  
 <code javascript>​ <code javascript>​
-questApp.directive("​answerList"​, function () {+app.directive('​fooBar'​, function () {
     return {     return {
 +        template: "Hello world",​
         link: function (scope, element, attrs) {         link: function (scope, element, attrs) {
 +            console.log('​fooBar'​);​
 +        }
 +    };
 +});
 +</​code>​
  
-            scope.data = scope[attrs["​answerList"​]];​ +В браузере мы увидим Hello world внутри нашей директивы.  
-        }, + 
-        ​restrict:​ "​A"​+{{ :​angular:​angularjs:​custom_directive:​directive33.png |}
-        ​template:​ "<​div class='​answers'>"​ + + 
-        "<​div ng-repeat='​answer in data.answers'​ class='​answer'>"​ + +Как мы видим темплейтом является точто написано внутри директивы.\\ 
-            "​<div class='​vote'​>" + +Темплейты ​это не просто строки. Сюда можно написать разметку,​ например,​ div
-            "<​a class='vote-up' ​ng-click='​voteUp(answer)'></​a>"​ + + 
-            "<​span class='​rate'>​{{answer.rate}}</​span>"​ + +<code javascript
-            "<a class='​vote-down'​ ng-click='​voteDown(answer)'​></​a>"​ + +app.directive('fooBar', function ​() { 
-        "</​div>" ​+ +    ​return ​
-        ​"<​b>​{{answer.text}}</​b>"​ + +        ​template: ​"<div>Hello world</​div>"​, 
-        "<​p>​{{answer.author}}</​p>"​ + +        ​link: function (scope, element, attrs) ​
-        ​"<​p><​i>​{{answer.date}}</​i></​p>"​ + +            ​console.log('​fooBar'​);​ 
-    "</​div></​div>"​ +        } 
-    }+    };
 }); });
 </​code>​ </​code>​
  
-В шаблонах используются все те же стандартные директивы и выражения AngularJS.\+У нас внутри директивы отрендерился div с текстом Hello world внутри. ​В шаблонах ​можно написать любую разметку с классами и какими-то своими стилями.
  
-Чтобы упростить использования шаблонов, мы можем использовать внешние файлы для их храненияСоздадим рядом с главной страницей index.html ​папку **templates**Добавим в нее новый файл **answersTemplate.html** со следующим содержимым:​ +{{ :​angular:​angularjs:​custom_directive:​directive34.png |}} 
-<​code ​html4strict+ 
-<div class="​answers">​ +Теперь давайте попробуем добавить переменнуюДля этого в link функции ​опишем переменную scope.name и выведем ее. 
-    <div ng-repeat="​answer in question.answers"​ class="​answer">​ + 
-        <div class="​vote">​ +<​code ​javascript
-            <a class="​vote-up"​ ng-click="​voteUp(answer)"></​a>​ +app.directive('​fooBar',​ function ​() { 
-            <​span class="​rate">​{{answer.rate}}</​span>​ +    ​return ​
-            <a class="vote-down"​ ng-click="​voteDown(answer)">​</a> +        ​template: ​"<​div>​Hello world {{name}}</div>", 
-        </div> +        ​link: function (scope, element, attrs) ​{ 
-        <b>{{answer.text}}</b+            console.log('​fooBar'​);​ 
-        ​<p>{{answer.author}}</​p>​ +            scope.name = "​Sasha";​ 
-        ​<​p><​i>​{{answer.date}}</​i></​p>​ +        } 
-    ​</​div>​ +    ​}; 
-</​div>​+});
 </​code>​ </​code>​
  
-Теперь проект выглядит следующим образом:​\ +{{ :​angular:​angularjs:​custom_directive:​directive35.png |}}
-{{  :​angular:​angularjs:​custom_directive:​21.png?​200  ​}}+
  
-По сути это ​весь тот кодкоторый ранее был заключен в свойстве templateТеперь ​изменим директиву ​answerList ​следующим образом:+В браузере у нас вывелось Hello world Sasha. Как это работает? У нашей ​директивы есть scope и в нем мы создали новую переменную nameИ теперь ​эта переменная ​доступна нам в этом шаблоне, так как этот шаблон привязан к нашему scope.\\ 
 +\\ 
 +Давайте ​сделаем что-то более сложное. Создадим ​массив bookmarks с обьектами внутри.
  
 <code javascript>​ <code javascript>​
-questApp.directive("​answerList"​, function () {+app.directive('​fooBar'​, function () { 
 +    var bookmarks = [ 
 +        { 
 +            id: 1, 
 +            name: '​AngularJS'​ 
 +        }, 
 +        { 
 +            id: 2, 
 +            name: '​EmberJS'​ 
 +        }, 
 +        { 
 +            id: 3, 
 +            name: '​ReactJS'​ 
 +        } 
 +    ];
     return {     return {
 +        template: "<​div>​Hello world {{name}}</​div>",​
         link: function (scope, element, attrs) {         link: function (scope, element, attrs) {
 +            console.log('​fooBar'​);​
 +            scope.name = "​Sasha";​
 +        }
 +    };
 +});
 +</​code>​
 +Теперь давайте попробуем вывести эти значения в нашем шаблоне. Для начала нам нужно записать bookmarks в наш scope.
  
-            scope.data scope[attrs["​answerList"​] ||attrs["​source"​]];​+<code javascript>​ 
 +app.directive('​fooBar',​ function () { 
 +    var bookmarks ​= [ 
 +        { 
 +            id: 1, 
 +            name: '​AngularJS'​
         },         },
-        ​restrict: "A", +        ​
-        ​templateUrl: "templates/answersTemplate.html+            id: 2, 
-    }+            name: '​EmberJS'​ 
 +        }, 
 +        { 
 +            id: 3, 
 +            name: '​ReactJS'​ 
 +        } 
 +    ]; 
 +    return { 
 +        template: "<​div>​Hello world {{name}}</​div>​", 
 +        ​linkfunction (scope, element, attrs) { 
 +            console.log('​fooBar'​);​ 
 +            scope.name = "Sasha";​ 
 +            scope.myBookmarks = bookmarks;​ 
 +        } 
 +    }; 
 +}); 
 +</code> 
 +Дальше нам нужно в шаблоне создать ng-repeat. 
 + 
 +<code javascript>​ 
 +app.directive('​fooBar',​ function () { 
 +    var bookmarks = [ 
 +        { 
 +            id: 1, 
 +            name: '​AngularJS'​ 
 +        }, 
 +        { 
 +            id: 2, 
 +            name: '​EmberJS'​ 
 +        }, 
 +        { 
 +            id: 3, 
 +            name: '​ReactJS'​ 
 +        } 
 +    ]; 
 +    return { 
 +        template: ​"<div ng-repeat='​bookmark in myBookmarks'>​{{bookmark.name}}</​div>",​ 
 +        link: function (scope, element, attrs) { 
 +            console.log('​fooBar'​);​ 
 +            scope.name = "​Sasha";​ 
 +            scope.myBookmarks = bookmarks;​ 
 +        } 
 +    };
 }); });
 </​code>​ </​code>​
 +{{ :​angular:​angularjs:​custom_directive:​directive36.png |}}
 +Как мы видим, на экран вывелся список наших закладок. Как так получилось?​ Переменная myBookmarks находится внутри scope, поэтому она доступна в шаблоне. В template мы можем писать любой html текст и angular атрибуты,​ например,​ ng-repeat, что позволяет нам выводить цикл в директиве или любые другие значения,​ какие мы хотим.\\
 +\\
 +В следующих уроках мы посмотрим,​ как усложнить шаблоны и как вынести их за пределы директивы.
  
-Теперь вместо свойства template используется свойство **templateUrl**,​ которое позволяет установить адрес шаблона. 
  
  
angular/angularjs/custom_directive/templates.1592379385.txt.gz · Последние изменения: 2023/01/12 12:15 (внешнее изменение)