Оглавление:
Карта сайта:
Оглавление:
Карта сайта:
Привязка данных раскрывается через ряд директив:
Рассмотрим директивы на примере того же контроллера phonesController:
var myApp=angular.module('myApp', []); myApp.controller('phoneController', function($scope) { $scope.phones = [{ name: 'Nokia Lumia 630', year: 2014, price: 200, company: { name: 'Nokia', country: 'Финляндия' } },{ name: 'Samsung Galaxy S 4', year: 2014, price: 400, company: { name: 'Samsung', country: 'Республика Корея' } },{ name: 'Mi 5', year: 2015, price: 300, company: { name: 'Xiaomi', country: 'Китай' } }] });
Директива ng-bind используется для создания односторонней привязки одного элемента html к какому-нибудь выражению. И если данное выражение изменится, то вместе с ним обновится и содержимое связанного элемента html. Например, в прошлом разделе мы использовали массив моделей phone. Свяжем элемент с одним из таких объектов:
<div ng-controller="phoneController"> <p>Количество элементов: <span ng-bind="phones.length"></span></p> <p>Первый элемент: <span ng-bind="phones[0].name"></span></p> </div>
Здесь идет привязка к длине массива phones и к первому его элементу. Если мы добавим в массив новый элемент или изменим название первого элемента, то соответственно изменится и текст в привязанных элементах span.
Директива ng-model позволяет выполнять двустороннюю привязку как к свойствам объекта, так и к вложенным свойствам:
<input type="text" ng-model="property" /> <input type="text" ng-model="object.property" /> <input type="text" ng-model="object.property.property" />
Директиву ng-model можно использовать для привязки к элементам input, textarea и select:
<div ng-controller="phoneController"> <input type="text" ng-model="phones[0].name" / > <p ng-bind="phones[0].name"></p> </div>
При изменении текста в поле ввода синхронно будет изменяться и привязанный к phones[0].name элемент p.
Директива ng-bind-template позволяет задать шаблон привязки с использованием выражений. Например:
<div ng-controller="phoneController"> <p ng-bind-template="{{phones[0].name}}: {{phones[0].price}} $"></p> </div>
Но бывает, что нам надо, чтобы AngularJS не обрабатывал какие-то выражения и не использовал привязку. В этом случае мы можем применить директиву ng-non-bindable:
<p>{{1 + 2}}</p> <p ng-non-bindable>{{1 + 2}}</p>
Если в первом случае AngularJS обработает выражение и выведет на страницу его результат, то во втором случае выражение будет выведено как есть.
Директива ng-bind-html позволяет выводить на страницу html-содержимое со всеми тегами. При использовании этой директивы необходимо помнить, результатом вывода может быть потенциально небезопасный код, например, содержащий javascript, поэтому данный аспект надо учитывать.
Чтобы осуществить привязку к коду html, надо подключить дополнительный файл. В архиве библиотеки, который можно найти на официальном сайте, имеется файл angular-sanitize.js, а также его минимизированный аналог. Положим этот файл в одну папку с главной библиотекой angularjs и изменим код страницы следующим образом:
<!doctype html> <html ng-app="myApp"> <head> <meta charset="utf-8"> </head> <body> <div ng-controller="helloController"> <p><textarea ng-model="htmlcode"></textarea></p> <p ng-bind-html="htmlcode"></p> </div> <script src="js/lib/angular.min.js"></script> <script src="js/lib/angular-sanitize.min.js"></script> <script type="text/javascript"> var myApp = angular.module('myApp', ["ngSanitize"]); myApp.controller('helloController', function($scope) { $scope.htmlcode="Директива <b>ng-bind-html</b>"; }); </script> </body> </html>
Чтобы задествовать модуль angular-sanitize, надо при создании модуля установить зависимость от angular-sanitize: var myApp = angular.module('myApp', [«ngSanitize»]);. После этого мы сможем изменять код в текстовом поле, в том числе вносить код html, и все изменения автоматически будут применяться к веб-странице.