angular .module('app', []) .controller('MainCtrl', function () { });  function MainCtrl () { } angular .module('app', []) .controller('MainCtrl', MainCtrl);  function MainCtrl ($scope) { $scope.items = [{ name: ' ', id: 7297510 },{ name: '', id: 0278916 },{ name: '', id: 2389017 },{ name: '', id: 1000983 }]; } angular .module('app') .controller('MainCtrl', MainCtrl);  <div ng-controller="MainCtrl"> <ul> <li ng-repeat="item in items"> {{ item.name }} </li> </ul> </div>  function MainCtrl () { this.items = [{ name: ' ', id: 7297510 },{ name: '', id: 0278916 },{ name: '', id: 2389017 },{ name: '', id: 1000983 }]; } angular .module('app') .controller('MainCtrl', MainCtrl);  <div ng-controller="MainCtrl as main"> <ul> <li ng-repeat="item in main.items"> {{ item.name }} </li> </ul> </div>  function UserService () { this.sayHello = function (name) { return '  ' + name; }; } angular .module('app') .service('UserService', UserService);  function MainCtrl (UserService) { this.sayHello = function (name) { UserService.sayHello(name); }; } angular .module('app') .controller('MainCtrl', MainCtrl);  function UserService () { var UserService = {}; function greeting (name) { return '  ' + name; } UserService.sayHello = function (name) { return greeting(name); }; return UserService; } angular .module('app') .factory('UserService', UserService);  function MainCtrl (UserService) { this.sayHello = function (name) { UserService.sayHello(name); }; } angular .module('app') .controller('MainCtrl', MainCtrl);  function MainCtrl () { this.items = [{ name: ' ', id: 7297510 },{ name: '', id: 0278916 },{ name: '', id: 2389017 },{ name: '', id: 1000983 }]; } angular .module('app') .controller('MainCtrl', MainCtrl);  <div ng-controller="MainCtrl as main"> {{ main.items.length }} .   </div>  <div ng-controller="MainCtrl as main"> <div> {{ main.items.length }} .   </div> <ul> <li ng-repeat="item in main.items" ng-click="main.removeFromStock(item, $index)"> {{ item.name }} </li> </ul> </div>  function MainCtrl () { this.removeFromStock = function (item, index) { this.items.splice(index, 1); }; this.items = [...]; } angular .module('app') .controller('MainCtrl', MainCtrl);  var vm = this;  vm β  ViewModel.      .    : function MainCtrl () { var vm = this; vm.removeFromStock = function (item, index) { vm.items.splice(index, 1); }; vm.items = [...]; } angular .module('app') .controller('MainCtrl', MainCtrl);  <ul> <li ng-repeat="item in main.items"> {{ item }} </li> </ul> Message: {{main.message}}
 <input type="text" ng-model="main.message"> <a href=" ng-click="main.showMessage(main.message);"> </a>  <a ng-href="{{ main.someValue }}">Go</a> <img ng-src="{{ main.anotherValue}}" alt=">  <div class="notification" ng-class="{ warning: main.response == 'error', ok: main.response == 'success' }"> {{ main.responseMsg }} </div>  <a href=" ng-click="showMenu = !showMenu"> !</a> <ul ng-show="showMenu"> <li>1</li> <li>2</li> <li>3</li> </ul>  <div ng-if="main.userExists">   </div>  <div ng-switch on="main.user.access"> <div ng-switch-when="admin"> <!-- code for admins --> </div> <div ng-switch-when="user"> <!-- code for users --> </div> <div ng-switch-when="author"> <!-- code for authors --> </div> </div>  <p>{{ main.name }}</p> <p ng-bind="main.name"></p>  <my-element></my-element> <div my-element></div> <div class="my-element"></div> <!-- directive: my-element -->  <my-element>  ! </my-element>  { template: '<div>' + '<ul>' + '<li ng-repeat="item in vm.items">' + '{{ item }}' + '</li>' + '</ul>' + '</div>' }  { template: [ '<div>', '<ul>', '<li ng-repeat="item in vm.items">', '{{ item }}', '</li>', '</ul>', '</div>' ].join('') }   ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);, .
:
{ templateUrl: 'items.html' }
Angular DOM id, , HTTP GET.
<script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script>
text/ng-template, , JavaScript. , . template, . , Angular , ng-include ng-view. Angular GET- .
$templateCache .
9.4 API
API , . β return, . , .
function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective);
.
function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective);
9.4.1 restrict
restrict β . , 'A'. 'E', β 'M' β 'C'.
9.4.2 replace
. <some-directive></some-directive> replace: true, .
9.4.3 scope
$scope , . $scope , .
9.4.4 controllerAs
, . controllerAs: 'something', something.myMethod()
9.4.5 controller
. MainCtrl , controller: 'MainCtrl'. controller: function () {}. ViewModel .
9.4.6 link
link , DOM, - -, Angular.
DOM, link. $scope, $element $attrs, DOM, {{ }}. link , Angular.
9.5
, βemailβ, To, Subject Message.
<compose-email> , . DOM , , . .
function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail);
composeEmail , HTML. , Angular , composeEmail <compose-email></compose-email>
10
, - . , , , . .
DOM | , Angular, $filter, JavaScript HTML.
HTML :
{{ filter_expression | filter : expression : comparator }}
JavaScript :
$filter('filter')(array, expression, comparator);
HTML. .
10.1
, Angular . $scope.timeNow = new Date().getTime():
<p> : {{ timeNow | date:'dd-MM-yyyy' }} </p>
10.2 JSON
JSON JavaScript JSON. DOM . JSON </code> <source lang="html"> <pre> {{ myObject | json }}
10.3 limitTo orderBy
β . ?
limitTo , β ng-repeat.
<ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul>
10 . limitTo ng-repeat.
orderBy , . :
{ name: 'Todd Motto', }
:
<ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul>
.
11
. Angular API. . $digest.
11.1
, . .filter(). .
, .
function myFilter () { return function () { // }; } angular .module('app') .filter('myFilter', myFilter);
. ( Angular ).
function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase);
item . , :
<p>{{ user.name | toLowercase }}</p>
11.2
. , . , , 'A'.
function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
ng-repeat:
<ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul>
:
<ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul>
something :
function namesStartingWithA () { return function (items, something) { // "items", "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA);
11.3
.filter(), , . , this.namesStartingWithA, , . controllerAs.
function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl);
DOM :
<ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul>
12 $routeProvider
Angular, : Angular . , , URL. ngRoute
angular .module('app', [ 'ngRoute' ]);
, , $routeProvider .config(). .when().
, β «» /inbox , . .when() , URL. β . .otherwise(), .
function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router);
, . , inbox.html.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' });
. Angular controller controllerAs.
$routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' });
, β , . , URL ( id ..). . , id 173921938 /inbox/email/173921938, - '/inbox/email/:id'.
/inbox/email/173921938, Angular , /inbox/email/902827312.
:
function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router);
, . , . ng-view. - :
<div ng-view></div>
URL Angular, , . , .
12.1 $routeParams
$routeParams URL , . , id :id
, $routeParams:
function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) // .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl);
13
, , DOM .
, .
<form name="myForm"></form>
Angular , , , ..
13.1 HTML5
HTML5 pattern, . Angular . , Angular , required ng-required, . Angular.
13.2 $pristine
Angular $pristine β , . Angular ng-pristine , .
13.4 $dirty
pristine β , . ng-dirty, ng-pristine . $pristine .
13.5 $valid
$valid. , ng-required, , ng-valid
13.6 $invalid
valid. , $invalid β ng-invalid. , .
13.7
β , - . , . , .
<input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length"> </button>
user.name.length true, . , .
14 $http $resource
Angular API, $http $resource. , $digest, .
14.1 $http
jQuery $.ajax, . $http . $http({...}), $http.get(...). $http API , $q.
, . HTTP- GET:
$http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { });
, , . , :
$http.get('/url') .success(function (response) { }) .error(function (reason) { });
.then(), Angular:
$http.get('/url') .then(function (response) { // }, function (reason) { // });
jQuery, Angular $http $scope.$apply(), .
14.2 $resource
$http ngResource. API $resource, CRUD- (create, read, update, delete). $resource , REST.
function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService);
Movies .
function MovieCtrl (MovieService) { var movies = new MovieService(); // movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);  ,    . 
 
  : 
 
 { templateUrl: 'items.html' } 
 
 Angular    DOM     id,    ,     HTTP GET. 
 
 <script type="text/ng-template" id="/hello.html"> <div> <ul> <li ng-repeat="item in vm.items"> {{ item }} </li> </ul> </div> </script> 
 
       text/ng-template,      ,  JavaScript.        ,      .     template,     .   , Angular  ,       ng-include  ng-view.    Angular  GET-   . 
 
      $templateCache     . 
 
 9.4 API  
    API ,      .   β return,  .  ,     . 
 
 function someDirective () { return { }; } angular .module('app') .directive('someDirective', someDirective); 
 
       . 
 
 function someDirective () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'something', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="some-directive">', 'My directive!', '</div>' ].join('') }; } angular .module('app') .directive('someDirective', someDirective); 
 
 9.4.1 restrict 
    restrict β     .        ,    'A'.         'E',  β 'M'    β 'C'. 
 
 9.4.2 replace 
    .    <some-directive></some-directive>   replace: true,          . 
 
 9.4.3 scope 
   $scope    ,    .    $scope    ,    . 
 
 9.4.4 controllerAs 
     ,      .    controllerAs: 'something',          something.myMethod() 
 
 9.4.5 controller 
      .  MainCtrl  ,     controller: 'MainCtrl'.            controller: function () {}.         ViewModel    . 
 
 9.4.6 link 
  link   ,       DOM,     -      -,    Angular. 
 
      DOM,      link.     $scope,    $element   $attrs,     DOM,    {{ }}.  link    ,       Angular. 
 
 9.5   
     ,     βemailβ,     To, Subject  Message. 
 
    <compose-email> ,      .       DOM ,        ,      .   . 
 
 function composeEmail () { return { restrict: 'EA', replace: true, scope: true, controllerAs: 'compose', controller: function () { }, link: function ($scope, $element, $attrs) { }, template: [ '<div class="compose-email">', '<input type="text" placeholder="To..." ng-model="compose.to">', '<input type="text" placeholder="Subject..." ng-model="compose.subject">', '<textarea placeholder="Message..." ng-model="compose.message"></textarea>', '</div>' ].join('') }; } angular .module('app') .controller('composeEmail', composeEmail); 
 
      composeEmail   ,     HTML. ,  Angular    ,  composeEmail   <compose-email></compose-email> 
 
 10  
        ,   - .     ,      ,   ,     .     . 
 
      DOM     |  ,   Angular,    $filter,     JavaScript   HTML. 
 
 HTML : 
 
 {{ filter_expression | filter : expression : comparator }} 
 
 JavaScript : 
 
 $filter('filter')(array, expression, comparator); 
 
       HTML.    . 
 
 10.1   
    ,  Angular   .        $scope.timeNow = new Date().getTime(): 
 
 <p>   : {{ timeNow | date:'dd-MM-yyyy' }} </p> 
 
 10.2  JSON 
   JSON   JavaScript   JSON.        DOM  .      JSON   </code> <source lang="html"> <pre> {{ myObject | json }} 
 
 
 10.3 limitTo  orderBy 
     β     .      ? 
 
 limitTo   ,    β     ng-repeat. 
 
 <ul> <li ng-repeat="user in users | limitTo:10"> {{ user.name }} </li> </ul> 
 
     10 .     limitTo  ng-repeat. 
 
 orderBy    ,      .       : 
 
 { name: 'Todd Motto', } 
 
        : 
 
 <ul> <li ng-repeat=" user in users | orderBy:'name' "> {{ user.name }} </li> </ul> 
 
        . 
 
 11   
        .     Angular  API.        .         $digest. 
 
 11.1    
   ,    .     .filter().         . 
 
   ,    . 
 
 function myFilter () { return function () { //   }; } angular .module('app') .filter('myFilter', myFilter); 
 
       .          (  Angular    ). 
 
 function toLowercase () { return function (item) { return item.toLowerCase(); }; } angular .module('app') .filter('toLowercase', toLowercase); 
 
 item     .     ,  : 
 
 <p>{{ user.name | toLowercase }}</p> 
 
 11.2    
         .   ,       . ,   ,   'A'. 
 
 function namesStartingWithA () { return function (items) { return items.filter(function (item) { return /$a/i.test(item.name); }); }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
    ng-repeat: 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA"> {{ item }} </li> </ul> 
 
       : 
 
 <ul> <li ng-repeat="item in items | namesStartingWithA:something"> {{ item }} </li> </ul> 
 
 something     : 
 
 function namesStartingWithA () { return function (items, something) { //     "items",   "something" }; } angular .module('app') .filter('namesStartingWithA', namesStartingWithA); 
 
 11.3   
 
      .filter(),     ,     .   ,      this.namesStartingWithA,        ,   .      controllerAs. 
 function SomeCtrl () { this.namesStartingWithA = function () { }; } angular .module('app') .controller('SomeCtrl', SomeCtrl); 
 
     DOM  : 
 
 <ul> <li ng-repeat="item in vm.items | filter:namesStartingWithA"> {{ item }} </li> </ul> 
 
 12    $routeProvider 
      Angular,      :   Angular    .     ,    ,          URL.     ngRoute 
 
 angular .module('app', [ 'ngRoute' ]); 
 
     ,    ,  $routeProvider      .config().        .when(). 
 
 ,         β    «» /inbox ,     .     .when()  ,   URL.   β    .    .otherwise(),     . 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', {}) .otherwise({ redirectTo: '/inbox' }); } angular .module('app') .config(router); 
 
       ,      . ,    inbox.html. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html' }) .otherwise({ redirectTo: '/inbox' }); 
 
    .  Angular     controller  controllerAs. 
 
 $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .otherwise({ redirectTo: '/inbox' }); 
 
  ,       β      ,     .     ,        URL ( id  ..).           . ,     id 173921938   /inbox/email/173921938,     - '/inbox/email/:id'. 
 
     /inbox/email/173921938, Angular       ,    /inbox/email/902827312. 
 
    : 
 
 function router ($routeProvider) { $routeProvider .when('/inbox', { templateUrl: 'views/inbox.html', controller: 'InboxCtrl', controllerAs: 'inbox' }) .when('/inbox/email/:id', { templateUrl: 'views/email.html', controller: 'EmailCtrl', controllerAs: 'email' }) .otherwise({ redirectTo: '/inbox' }); }); angular .module('app') .config(router); 
 
    ,  .    ,       .    ng-view.    - : 
 
 <div ng-view></div> 
 
   URL  Angular,  ,        .   ,     . 
 
 12.1 $routeParams 
  $routeParams   URL      ,    . ,      id        :id 
 
   ,    $routeParams: 
 
 function EmailCtrl ($routeParams, EmailService) { // $routeParams { id: 20999851 } EmailService .get($routeParams.id) //   .success(function (response) {}) .error(function (reason) {}); } angular .module('app') .('EmailCtrl', EmailCtrl); 
 
 13   
     ,           ,   DOM     . 
 
        ,    . 
 
 <form name="myForm"></form> 
 
 Angular          , ,      ,  .. 
 
 13.1 HTML5 
  HTML5    pattern,         . Angular   .  , Angular   ,   required      ng-required,      .       Angular. 
 
 13.2 $pristine 
     Angular     $pristine β  ,       . Angular   ng-pristine   ,    . 
 
 13.4 $dirty 
  pristine β  ,   .     ng-dirty,   ng-pristine .       $pristine   . 
 
 13.5 $valid 
       $valid. ,      ng-required,    ,     ng-valid 
 
 13.6 $invalid 
  valid.  ,      $invalid β    ng-invalid.         ,    . 
 
 13.7     
            β ,   -  .     ,    .     ,   . 
 
 <input type="text" ng-model="user.name" placeholder=" "> <button ng-disabled="!user.name.length">   </button> 
 
  user.name.length  true,  .       ,     . 
 
 14     $http  $resource 
      Angular   API, $http  $resource.      ,     $digest,      . 
 
 14.1 $http 
     jQuery $.ajax,      .  $http       .        $http({...}),       $http.get(...).  $http   API ,     $q. 
 
       ,         .   HTTP- GET: 
 
 $http.get('/url') .success(function (data, status, headers, config) { }) .error(function (data, status, headers, config) { }); 
 
       ,     ,   .       ,     : 
 
 $http.get('/url') .success(function (response) { }) .error(function (reason) { }); 
 
         .then(),   Angular: 
 
 $http.get('/url') .then(function (response) { //  }, function (reason) { //  }); 
 
     jQuery, Angular   $http  $scope.$apply(),          . 
 
 14.2 $resource 
   $http    ngResource.    API $resource,   CRUD- (create, read, update, delete). $resource  ,          REST. 
 
 function MovieService ($resource) { return $resource('/api/movies/:id', { id: '@_id' }, { update: { method: 'PUT' } } ); } angular .module('app') .factory('MovieService', MovieService); 
 
       Movies          . 
 
 function MovieCtrl (MovieService) { var movies = new MovieService(); //    movies.update(/* some data */); } angular .module('app') .controller('MovieCtrl', MovieCtrl);Source: https://habr.com/ru/post/247283/
All Articles