В угловом контроллере - это функция JavaScript (тип/класс), которая используется в качестве экземпляра угловой области (//www.vevb.com/article/91749.htm), который расширяется, кроме корня. Когда мы создаем новую детскую область через область прицела. $ New API (http://docs.angularjs.org/api/ng.$rootscope.scope#$new), есть возможность передать его в контроллер как параметр метода (я не понимаю его здесь, я знаю, что первый параметр контроллера является новым применением, с привязкой, с связкой, с связкой, с помощью связывания). С помощью связывания). С связком связывания). Это покажет, что контроллер и новая область должны быть объединены и расширить его поведение.
Контроллер может использоваться как:
1. Установите начальное состояние объекта Scope.
2. Добавьте поведение в область.
1. Настройка начального состояния объекта Scope
Обычно, когда мы создаем приложение, нам нужно установить состояние инициализации для угловой области.
Angular применяет новый объект Scope к конструктору контроллера (оно, по оценкам, передается в качестве параметра) и устанавливает начальное состояние объема. Это означает, что Angular никогда не создает экземпляров типа контроллера (то есть не использует новый оператор для конструктора контроллера). Конструктор всегда применяется к существующим объектам охвата.
Мы создаем исходное состояние масштаба, создав атрибут модели. Например:
Функция GreetingCtrl ($ scope) {$ scope.greeting = "hola!";}
Контроллер "GreetingCtrl" создает модель, называемую «приветствие», которая может быть применена к шаблону.
2. Добавление поведения в объект Scope
Поведение на угловом объекте охвата находится в форме атрибутов метода областей для шаблонов и представлений. Такое поведение может изменить модель приложения.
Как обсуждалось в главе модели с гидом (//www.vevb.com/article/91777.htm), любой объект (или примитивный тип) присваивается области и становится атрибутом модели. Любая функция, прикрепленная к областям, доступна для представлений шаблонов и может быть вызвана через угловое выражение или посредством директивы по обработчику событий NG (например, NGCLICK).
3. Правильное использование контроллеров
Вообще говоря, контроллеры не должны пытаться делать слишком много. Он должен содержать только бизнес -логику, необходимую для одного представления (и она не обернулась, и я всегда думал, что контроллер - это просто пересылка ...).
Чтобы контроллер был простым, общим способом является извлечение работы, которая не принадлежит контроллеру в сервис, и использовать эти услуги посредством инъекции зависимостей в контроллере. Эти вещи будут обсуждаться в главе Услуги по инъекциям зависимостей «Волшебника».
Не делайте следующее в контроллере:
4. Связывание контроллеров с угловатыми объектами
Мы можем явно связать объекты контроллера и прицел с помощью областей.
1. Пример конструктора и метода контроллера
Чтобы проиллюстрировать, как работает компонент контроллера в угловых, давайте создадим небольшое приложение, используя следующие компоненты:
Сообщение в нашем шаблоне содержит привязку к модели специй, которая по умолчанию установлена на «очень». Установите значение модели Spice на «чили» или «халапеньо» в соответствии с нажатой кнопкой, и сообщение будет автоматически обновляться при привязке данных.
<! Doctype html> <html ng-app> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <title> spicy-controller </title> <meta content = "ie = edge, chrome = 1" http-equiveler = "x-ua-compatible" htttp-equviller type = "text/css"> .ng-cloak {display: none; } </style> </head> <body> <div ng-controller = "spicyctrl"> <button ng-click = "chilispicy ()"> chili </button> <button ng-click = "jalapenospicy ('jalapeño')"> jalapeño </button> <p> divice {{pice} spice spice} spice} spice} spice} spice} spice? src = "../ angular -1.0.1.js" type = "text/javascript"> </script> <script type = "text/javascript"> function spicyctrl ($ scope) {$ scope.spice = "очень"; $ scope.chilispicy = function () {$ scope.spice = "chili"; }; $ scope.jalapenospicy = function (val) {this.spice = val; }; } </script> </body> </html>Вещи в приведенном выше примере:
Метод контроллера может принимать параметры, как показано в следующем примере:
<! Doctype html> <html ng-app> <head> <meta http-equiv = "content-type" content = "text/html; warset = utf-8"/> <title> controller-method-arments </title> <meta content = "ie = Edge, chrome = 1" http-equivment type = "text/css"> .ng-cloak {display: none; } </style> </head> <body> <div ng-controller = "spicyctrl"> <input ng-model = "customspice" value = "wasabi"/> <button ng-click = "spicy (custmentspice)"> customspice </button> <bry/> <button ng-click = "spicy ('chili')"> chili </wind <p> <ptino widi <ptine <ptine '> chil {{spice}} spicy! </p> </div> <script src = "../ angular-1.0.1.js" type = "text/javascript"> </script> <script type = "text/javascript"> function spicyctrl ($ scope) {$ scope.spicy = "очень"; $ scope.spicy = function (spice) {$ scope.spice = spice; }; } </script> </body> </html>Обратите внимание, что контроллер Spicyctrl теперь определяет только метод с параметрами «специи» и называемый «пряный». Шаблон может ссылаться на метод контроллера и передавать ему постоянное значение или значение модели.
Наследование контроллера в угловом направлении основано на наследстве прицела. Давайте посмотрим на следующий пример:
<! Doctype html> <html ng-app> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <title>-controller-inhivence </title> <meta content = "ie = edge, chrome = 1" http-eaviance </title> <-u-compatible "http-eavivance </title> <-u-compaitible" http-eavivance </tit type = "text/css"> .ng-cloak {display: none; } </style> </head> <body> <div ng-controller = "mainctrl"> <p> good {{timeOfday}}, {{name}}! </p> <div ng-controller = "childctrl"> <p> good {{{timeofday}}, {name}}! ng-controller = "babyctrl"> good {{timeofday}}, {{name}}! </p> </div> </div> <script src = "../ angular-1.0.1.js" type = "text/javascript"> </script> <script type = "text/javascript"> $ scope) $ scope.timeofday = 'Основное время'; $ scope.name = 'главное имя'; } function childctrl ($ scope) {$ scope.name = 'gild name'; } function babyctrl ($ scope) {$ scope.timeofday = 'baby time'; $ scope.name = 'детское имя'; } </script> </body> </html>Обратите внимание, как мы гнездясь 3 Ngcontroller непосредственно в шаблон. Для нашего взгляда эта структура шаблона приведет к созданию 4 областей:
Унаследованная работа такая же в контроллере и модели. Таким образом, в нашем предыдущем примере все модели могут быть переписаны через контроллер.
ПРИМЕЧАНИЕ. Стандартное прототип наследование между двумя контроллерами не работает, как мы думали, потому что, как мы упоминали ранее, контроллер не инициализируется непосредственно через угловую, но вместо этого применяет этот объект Scope. (Контроллеры не создаются непосредственно с помощью угловых, а скорее применяются к объекту Scope, вот так же, как и раньше, я до сих пор не понимаю.)
5. Тестирование контроллера
Несмотря на то, что есть много способов проверить контроллеры, одно из лучших конвенций, как показано ниже, требует впрыскивания $ rootcope и контроллера $. (Тест должен быть скоординирован с jasmine.js)
<! Doctype html> <html ng-app> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <title> controller-test </title> <meta content = "ie = chrome = 1" http-equiv = "x-u-compatible" linkeshiptible "http-equiv =" x-ua-compatible " href = "../ jasmine.css"> <style type = "text/css"> .ng-cloak {display: none; } </style> </head> <body> <script src = "../ angular-1.0.1.js" type = "text/javascript"> </script> <script src = "../ angular-scenario-1.0.1.js" type = "text/javascript"> </script> <script src = "... jasmine. type = "text/javascript"> </script> <script src = "../ angular-mocks-1.0.1.js" type = "text/javascript"> </script> <script type = "text/javascript"> function myController ($ scope) {$ scope.spices = [{"name": "pasilla", "SPICESE) {$ scope.spices = [{" name ":", ", SPIC", SPICESIONE ",", SPICESIONE ",", SPICESIONE ",", SPICESE) {"name": "jalapeno", "Spiceiness": "Hot Hot!"}, {"name": "habanero", "Spicesy": "lava hot !!"}]; $ scope.spice = "habanero"; } Описать ("myController function", function () {descript ("myController", function () {var scope; ineage (inject (function ($ rootcope, $ controller) {scope = $ rootscope. $ new (); var ctrl = $ controller (myController, {$ scope: scope}); Spices ', function () {wearm (scope.spices.length) .tobe (3); }); (function () {var jasmineenv = jasmine.getenv (); jasmineenv.updateinterval = 1000; var trivialreporter = new Jasmine.trivialreporter (); jasmineenv.addreporter (trivialreporter); jasmineenv.specfilter = function (spectore); };Если нам нужно проверить вложенного контроллера, нам нужно создать ту же взаимосвязь наследования прицела в тесте, что и в DOM.
<! Doctype html> <html ng-app> <head> <meta http-equiv = "content-type" content = "text/html; charset = utf-8"/> <title> controller-test </title> <meta content = "ie = chrome = 1" http-equiv = "x-u-compatible" linkeshiptible "http-equiv =" x-ua-compatible " href = "../ jasmine.css"> <style type = "text/css"> .ng-cloak {display: none; } </style> </head> <body> <script src = "../ angular-1.0.1.js" type = "text/javascript"> </script> <script src = "../ angular-scenario-1.0.1.js" type = "text/javascript"> </script> <script src = "... jasmine. type = "text/javascript"> </script> <script src = "../ angular-mocks-1.0.1.js" type = "text/javascript"> </script> <script type = "text/javascript"> function mainctrl ($ scope) {$ scope.timeOfday = 'MainCope'; $ scope.name = 'главное имя'; } function childctrl ($ scope) {$ scope.name = 'gild name'; } function babyctrl ($ scope) {$ scope.timeofday = 'baby time'; $ scope.name = 'детское имя'; } описать ("myController", function () {var mainscope, childscope, babyscope; inject (inject (function ($ rootcope, $ controller) {mainscope = $ rotscope. $ new (); var mainctrl = $ controller (mainctrl, {$ scope: mainscope}); $ controller (childctrl, {$ scope: kildscope}); Ожидайте (mainscope.name) .tobe («Основное имя»); (function () {var jasmineenv = jasmine.getenv (); jasmineenv.updateinterval = 1000; var trivialreporter = new Jasmine.trivialreporter (); jasmineenv.addreporter (trivialreporter); jasmineenv.specfilter = function (spectore); };Выше приведено информация об angularjs, понимающем компонент контроллера. Мы будем продолжать добавлять соответствующую информацию в будущем. Спасибо за вашу поддержку!