angularjs-rails 1.4.0 → 1.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +9 -8
- data/vendor/assets/javascripts/angular-aria.js +28 -13
- data/vendor/assets/javascripts/angular-cookies.js +9 -8
- data/vendor/assets/javascripts/angular-loader.js +23 -10
- data/vendor/assets/javascripts/angular-message-format.js +1 -1
- data/vendor/assets/javascripts/angular-messages.js +3 -3
- data/vendor/assets/javascripts/angular-mocks.js +2 -2
- data/vendor/assets/javascripts/angular-resource.js +3 -2
- data/vendor/assets/javascripts/angular-route.js +2 -3
- data/vendor/assets/javascripts/angular-sanitize.js +4 -4
- data/vendor/assets/javascripts/angular-scenario.js +459 -226
- data/vendor/assets/javascripts/angular-touch.js +3 -2
- data/vendor/assets/javascripts/angular.js +459 -226
- data/vendor/assets/javascripts/unstable/angular2.js +10471 -6176
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1c924719d1629cab7fd1823f2e859913bd0ad48a
|
4
|
+
data.tar.gz: f0380593bbd1beca71ddddad5ffe29288535a4c7
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e2ccfb66fb68a67624f7b9f53cddf97f157a0cb3085164883f3a9636b511245f665bbe8d97b12fcf6309cc5e1c01d315bf0f91713b8bea269ef94ad0ea45fce4
|
7
|
+
data.tar.gz: f781284c10730d7193f79b5a1498c020ca3ec0afcc08470a6abcbdaad6b9b520a2bbc38e9ffcbd69d1e320c194e9a59796ffabcf6ae1f5e93576c7cb6568496d
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -504,7 +504,8 @@ var $$AnimateChildrenDirective = [function() {
|
|
504
504
|
* unless you really need a digest to kick off afterwards.
|
505
505
|
*
|
506
506
|
* Keep in mind that, to make this easier, ngAnimate has tweaked the JS animations API to recognize when a runner instance is returned from $animateCss
|
507
|
-
* (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).
|
507
|
+
* (so there is no need to call `runner.done(doneFn)` inside of your JavaScript animation code).
|
508
|
+
* Check the {@link ngAnimate.$animateCss#usage animation code above} to see how this works.
|
508
509
|
*
|
509
510
|
* @param {DOMElement} element the element that will be animated
|
510
511
|
* @param {object} options the animation-related options that will be applied during the animation
|
@@ -3020,7 +3021,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3020
3021
|
* opacity:0;
|
3021
3022
|
* }
|
3022
3023
|
*
|
3023
|
-
* /* The
|
3024
|
+
* /* The finishing CSS styles for the enter animation */
|
3024
3025
|
* .fade.ng-enter.ng-enter-active {
|
3025
3026
|
* opacity:1;
|
3026
3027
|
* }
|
@@ -3275,7 +3276,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3275
3276
|
* ## CSS + JS Animations Together
|
3276
3277
|
*
|
3277
3278
|
* AngularJS 1.4 and higher has taken steps to make the amalgamation of CSS and JS animations more flexible. However, unlike earlier versions of Angular,
|
3278
|
-
* defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore example below will only result in **JS animations taking
|
3279
|
+
* defining CSS and JS animations to work off of the same CSS class will not work anymore. Therefore the example below will only result in **JS animations taking
|
3279
3280
|
* charge of the animation**:
|
3280
3281
|
*
|
3281
3282
|
* ```html
|
@@ -3304,8 +3305,8 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3304
3305
|
* }
|
3305
3306
|
* ```
|
3306
3307
|
*
|
3307
|
-
* Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can
|
3308
|
-
* lack of CSS animations by
|
3308
|
+
* Does this mean that CSS and JS animations cannot be used together? Do JS-based animations always have higher priority? We can make up for the
|
3309
|
+
* lack of CSS animations by using the `$animateCss` service to trigger our own tweaked-out, CSS-based animations directly from
|
3309
3310
|
* our own JS-based animation code:
|
3310
3311
|
*
|
3311
3312
|
* ```js
|
@@ -3603,7 +3604,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3603
3604
|
* ngModule.directive('greetingBox', ['$animate', function($animate) {
|
3604
3605
|
* return function(scope, element, attrs) {
|
3605
3606
|
* attrs.$observe('active', function(value) {
|
3606
|
-
* value ? $animate.addClass(element, 'on')
|
3607
|
+
* value ? $animate.addClass(element, 'on') : $animate.removeClass(element, 'on');
|
3607
3608
|
* });
|
3608
3609
|
* });
|
3609
3610
|
* }]);
|
@@ -3614,7 +3615,7 @@ var $$AnimationProvider = ['$animateProvider', function($animateProvider) {
|
|
3614
3615
|
*
|
3615
3616
|
* ```css
|
3616
3617
|
* /* normally we would create a CSS class to reference on the element */
|
3617
|
-
*
|
3618
|
+
* greeting-box.on { transition:0.5s linear all; background:green; color:white; }
|
3618
3619
|
* ```
|
3619
3620
|
*
|
3620
3621
|
* The `$animate` service contains a variety of other methods like `enter`, `leave`, `animate` and `setClass`. To learn more about what's
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -19,8 +19,8 @@
|
|
19
19
|
*
|
20
20
|
* ## Usage
|
21
21
|
*
|
22
|
-
* For ngAria to do its magic, simply include the module as a dependency. The
|
23
|
-
*
|
22
|
+
* For ngAria to do its magic, simply include the module `ngAria` as a dependency. The following
|
23
|
+
* directives are supported:
|
24
24
|
* `ngModel`, `ngDisabled`, `ngShow`, `ngHide`, `ngClick`, `ngDblClick`, and `ngMessages`.
|
25
25
|
*
|
26
26
|
* Below is a more detailed breakdown of the attributes handled by ngAria:
|
@@ -88,7 +88,8 @@ function $AriaProvider() {
|
|
88
88
|
ariaMultiline: true,
|
89
89
|
ariaValue: true,
|
90
90
|
tabindex: true,
|
91
|
-
bindKeypress: true
|
91
|
+
bindKeypress: true,
|
92
|
+
bindRoleForClick: true
|
92
93
|
};
|
93
94
|
|
94
95
|
/**
|
@@ -107,6 +108,8 @@ function $AriaProvider() {
|
|
107
108
|
* - **tabindex** – `{boolean}` – Enables/disables tabindex tags
|
108
109
|
* - **bindKeypress** – `{boolean}` – Enables/disables keypress event binding on `<div>` and
|
109
110
|
* `<li>` elements with ng-click
|
111
|
+
* - **bindRoleForClick** – `{boolean}` – Adds role=button to non-interactive elements like `div`
|
112
|
+
* using ng-click, making them more accessible to users of assistive technologies
|
110
113
|
*
|
111
114
|
* @description
|
112
115
|
* Enables/disables various ARIA attributes
|
@@ -120,9 +123,8 @@ function $AriaProvider() {
|
|
120
123
|
var ariaCamelName = attr.$normalize(ariaAttr);
|
121
124
|
if (config[ariaCamelName] && !attr[ariaCamelName]) {
|
122
125
|
scope.$watch(attr[attrName], function(boolVal) {
|
123
|
-
|
124
|
-
|
125
|
-
}
|
126
|
+
// ensure boolean value
|
127
|
+
boolVal = negate ? !boolVal : !!boolVal;
|
126
128
|
elem.attr(ariaAttr, boolVal);
|
127
129
|
});
|
128
130
|
}
|
@@ -270,13 +272,23 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
270
272
|
elem.attr('role', 'slider');
|
271
273
|
}
|
272
274
|
if ($aria.config('ariaValue')) {
|
273
|
-
|
274
|
-
|
275
|
+
var needsAriaValuemin = !elem.attr('aria-valuemin') &&
|
276
|
+
(attr.hasOwnProperty('min') || attr.hasOwnProperty('ngMin'));
|
277
|
+
var needsAriaValuemax = !elem.attr('aria-valuemax') &&
|
278
|
+
(attr.hasOwnProperty('max') || attr.hasOwnProperty('ngMax'));
|
279
|
+
var needsAriaValuenow = !elem.attr('aria-valuenow');
|
280
|
+
|
281
|
+
if (needsAriaValuemin) {
|
282
|
+
attr.$observe('min', function ngAriaValueMinReaction(newVal) {
|
283
|
+
elem.attr('aria-valuemin', newVal);
|
284
|
+
});
|
275
285
|
}
|
276
|
-
if (
|
277
|
-
|
286
|
+
if (needsAriaValuemax) {
|
287
|
+
attr.$observe('max', function ngAriaValueMinReaction(newVal) {
|
288
|
+
elem.attr('aria-valuemax', newVal);
|
289
|
+
});
|
278
290
|
}
|
279
|
-
if (
|
291
|
+
if (needsAriaValuenow) {
|
280
292
|
scope.$watch(ngAriaWatchModelValue, function ngAriaValueNowReaction(newVal) {
|
281
293
|
elem.attr('aria-valuenow', newVal);
|
282
294
|
});
|
@@ -342,7 +354,10 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
342
354
|
return true;
|
343
355
|
}
|
344
356
|
}
|
345
|
-
|
357
|
+
|
358
|
+
if ($aria.config('bindRoleForClick')
|
359
|
+
&& !elem.attr('role')
|
360
|
+
&& !isNodeOneOf(elem, nodeBlackList)) {
|
346
361
|
elem.attr('role', 'button');
|
347
362
|
}
|
348
363
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -17,8 +17,7 @@
|
|
17
17
|
*
|
18
18
|
* <div doc-module-components="ngCookies"></div>
|
19
19
|
*
|
20
|
-
* See {@link ngCookies.$cookies `$cookies`}
|
21
|
-
* {@link ngCookies.$cookieStore `$cookieStore`} for usage.
|
20
|
+
* See {@link ngCookies.$cookies `$cookies`} for usage.
|
22
21
|
*/
|
23
22
|
|
24
23
|
|
@@ -48,7 +47,7 @@ angular.module('ngCookies', ['ng']).
|
|
48
47
|
* or a Date object indicating the exact date/time this cookie will expire.
|
49
48
|
* - **secure** - `{boolean}` - The cookie will be available only in secured connection.
|
50
49
|
*
|
51
|
-
* Note: by default the address that appears in your
|
50
|
+
* Note: by default the address that appears in your `<base>` tag will be used as path.
|
52
51
|
* This is import so that cookies will be visible for all routes in case html5mode is enabled
|
53
52
|
*
|
54
53
|
**/
|
@@ -65,9 +64,11 @@ angular.module('ngCookies', ['ng']).
|
|
65
64
|
* @description
|
66
65
|
* Provides read/write access to browser's cookies.
|
67
66
|
*
|
68
|
-
*
|
69
|
-
*
|
70
|
-
*
|
67
|
+
* <div class="alert alert-info">
|
68
|
+
* Up until Angular 1.3, `$cookies` exposed properties that represented the
|
69
|
+
* current browser cookie values. In version 1.4, this behavior has changed, and
|
70
|
+
* `$cookies` now provides a standard api of getters, setters etc.
|
71
|
+
* </div>
|
71
72
|
*
|
72
73
|
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
73
74
|
*
|
@@ -192,7 +193,7 @@ angular.module('ngCookies').
|
|
192
193
|
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
193
194
|
*
|
194
195
|
* <div class="alert alert-danger">
|
195
|
-
* **Note:** The $cookieStore service is deprecated
|
196
|
+
* **Note:** The $cookieStore service is **deprecated**.
|
196
197
|
* Please use the {@link ngCookies.$cookies `$cookies`} service instead.
|
197
198
|
* </div>
|
198
199
|
*
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -58,7 +58,7 @@ function minErr(module, ErrorConstructor) {
|
|
58
58
|
return match;
|
59
59
|
});
|
60
60
|
|
61
|
-
message += '\nhttp://errors.angularjs.org/1.4.
|
61
|
+
message += '\nhttp://errors.angularjs.org/1.4.2/' +
|
62
62
|
(module ? module + '/' : '') + code;
|
63
63
|
|
64
64
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -216,7 +216,7 @@ function setupModuleLoader(window) {
|
|
216
216
|
* @description
|
217
217
|
* See {@link auto.$provide#provider $provide.provider()}.
|
218
218
|
*/
|
219
|
-
provider:
|
219
|
+
provider: invokeLaterAndSetModuleName('$provide', 'provider'),
|
220
220
|
|
221
221
|
/**
|
222
222
|
* @ngdoc method
|
@@ -227,7 +227,7 @@ function setupModuleLoader(window) {
|
|
227
227
|
* @description
|
228
228
|
* See {@link auto.$provide#factory $provide.factory()}.
|
229
229
|
*/
|
230
|
-
factory:
|
230
|
+
factory: invokeLaterAndSetModuleName('$provide', 'factory'),
|
231
231
|
|
232
232
|
/**
|
233
233
|
* @ngdoc method
|
@@ -238,7 +238,7 @@ function setupModuleLoader(window) {
|
|
238
238
|
* @description
|
239
239
|
* See {@link auto.$provide#service $provide.service()}.
|
240
240
|
*/
|
241
|
-
service:
|
241
|
+
service: invokeLaterAndSetModuleName('$provide', 'service'),
|
242
242
|
|
243
243
|
/**
|
244
244
|
* @ngdoc method
|
@@ -273,7 +273,7 @@ function setupModuleLoader(window) {
|
|
273
273
|
* @description
|
274
274
|
* See {@link auto.$provide#decorator $provide.decorator()}.
|
275
275
|
*/
|
276
|
-
decorator:
|
276
|
+
decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),
|
277
277
|
|
278
278
|
/**
|
279
279
|
* @ngdoc method
|
@@ -307,7 +307,7 @@ function setupModuleLoader(window) {
|
|
307
307
|
* See {@link ng.$animateProvider#register $animateProvider.register()} and
|
308
308
|
* {@link ngAnimate ngAnimate module} for more information.
|
309
309
|
*/
|
310
|
-
animation:
|
310
|
+
animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),
|
311
311
|
|
312
312
|
/**
|
313
313
|
* @ngdoc method
|
@@ -325,7 +325,7 @@ function setupModuleLoader(window) {
|
|
325
325
|
* (`myapp_subsection_filterx`).
|
326
326
|
* </div>
|
327
327
|
*/
|
328
|
-
filter:
|
328
|
+
filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),
|
329
329
|
|
330
330
|
/**
|
331
331
|
* @ngdoc method
|
@@ -337,7 +337,7 @@ function setupModuleLoader(window) {
|
|
337
337
|
* @description
|
338
338
|
* See {@link ng.$controllerProvider#register $controllerProvider.register()}.
|
339
339
|
*/
|
340
|
-
controller:
|
340
|
+
controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),
|
341
341
|
|
342
342
|
/**
|
343
343
|
* @ngdoc method
|
@@ -350,7 +350,7 @@ function setupModuleLoader(window) {
|
|
350
350
|
* @description
|
351
351
|
* See {@link ng.$compileProvider#directive $compileProvider.directive()}.
|
352
352
|
*/
|
353
|
-
directive:
|
353
|
+
directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),
|
354
354
|
|
355
355
|
/**
|
356
356
|
* @ngdoc method
|
@@ -400,6 +400,19 @@ function setupModuleLoader(window) {
|
|
400
400
|
return moduleInstance;
|
401
401
|
};
|
402
402
|
}
|
403
|
+
|
404
|
+
/**
|
405
|
+
* @param {string} provider
|
406
|
+
* @param {string} method
|
407
|
+
* @returns {angular.Module}
|
408
|
+
*/
|
409
|
+
function invokeLaterAndSetModuleName(provider, method) {
|
410
|
+
return function(recipeName, factoryFunction) {
|
411
|
+
if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;
|
412
|
+
invokeQueue.push([provider, method, arguments]);
|
413
|
+
return moduleInstance;
|
414
|
+
};
|
415
|
+
}
|
403
416
|
});
|
404
417
|
};
|
405
418
|
});
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -56,7 +56,7 @@ var jqLite = angular.element;
|
|
56
56
|
*
|
57
57
|
* ```javascript
|
58
58
|
* <!-- keep in mind that ngModel automatically sets these error flags -->
|
59
|
-
* myField.$error = { minlength : true, required :
|
59
|
+
* myField.$error = { minlength : true, required : true };
|
60
60
|
* ```
|
61
61
|
*
|
62
62
|
* Then the `required` message will be displayed first. When required is false then the `minlength` message
|
@@ -256,7 +256,7 @@ angular.module('ngMessages', [])
|
|
256
256
|
*
|
257
257
|
* @description
|
258
258
|
* `ngMessages` is a directive that is designed to show and hide messages based on the state
|
259
|
-
* of a key/value object that it listens on. The directive itself
|
259
|
+
* of a key/value object that it listens on. The directive itself complements error message
|
260
260
|
* reporting with the `ngModel` $error object (which stores a key/value state of validation errors).
|
261
261
|
*
|
262
262
|
* `ngMessages` manages the state of internal messages within its container element. The internal
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1090,7 +1090,7 @@ angular.mock.dump = function(object) {
|
|
1090
1090
|
$httpBackend.flush();
|
1091
1091
|
|
1092
1092
|
$httpBackend.expectPOST('/add-msg.py', undefined, function(headers) {
|
1093
|
-
// check if the header was
|
1093
|
+
// check if the header was sent, if it wasn't the expectation won't
|
1094
1094
|
// match the request and the test will fail
|
1095
1095
|
return headers['Authorization'] == 'xxx';
|
1096
1096
|
}).respond(201, '');
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -214,7 +214,8 @@ function shallowClearAndCopy(src, dst) {
|
|
214
214
|
* - non-GET instance actions: `instance.$action([parameters], [success], [error])`
|
215
215
|
*
|
216
216
|
*
|
217
|
-
* Success callback is called with (value, responseHeaders) arguments
|
217
|
+
* Success callback is called with (value, responseHeaders) arguments, where the value is
|
218
|
+
* the populated resource instance or collection object. The error callback is called
|
218
219
|
* with (httpResponse) argument.
|
219
220
|
*
|
220
221
|
* Class actions return empty instance (with additional properties below).
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -596,9 +596,8 @@ function $RouteProvider() {
|
|
596
596
|
if (angular.isFunction(templateUrl)) {
|
597
597
|
templateUrl = templateUrl(nextRoute.params);
|
598
598
|
}
|
599
|
-
templateUrl = $sce.getTrustedResourceUrl(templateUrl);
|
600
599
|
if (angular.isDefined(templateUrl)) {
|
601
|
-
nextRoute.loadedTemplateUrl = templateUrl;
|
600
|
+
nextRoute.loadedTemplateUrl = $sce.valueOf(templateUrl);
|
602
601
|
template = $templateRequest(templateUrl);
|
603
602
|
}
|
604
603
|
}
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.2
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -233,7 +233,7 @@ var uriAttrs = makeMap("background,cite,href,longdesc,src,usemap,xlink:href");
|
|
233
233
|
var htmlAttrs = makeMap('abbr,align,alt,axis,bgcolor,border,cellpadding,cellspacing,class,clear,' +
|
234
234
|
'color,cols,colspan,compact,coords,dir,face,headers,height,hreflang,hspace,' +
|
235
235
|
'ismap,lang,language,nohref,nowrap,rel,rev,rows,rowspan,rules,' +
|
236
|
-
'scope,scrolling,shape,size,span,start,summary,target,title,type,' +
|
236
|
+
'scope,scrolling,shape,size,span,start,summary,tabindex,target,title,type,' +
|
237
237
|
'valign,value,vspace,width');
|
238
238
|
|
239
239
|
// SVG attributes (without "id" and "name" attributes)
|
@@ -631,8 +631,8 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
|
631
631
|
*/
|
632
632
|
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
633
633
|
var LINKY_URL_REGEXP =
|
634
|
-
/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]
|
635
|
-
MAILTO_REGEXP = /^mailto
|
634
|
+
/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/i,
|
635
|
+
MAILTO_REGEXP = /^mailto:/i;
|
636
636
|
|
637
637
|
return function(text, target) {
|
638
638
|
if (!text) return text;
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.4.
|
9193
|
+
* @license AngularJS v1.4.2
|
9194
9194
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9249,7 +9249,7 @@ function minErr(module, ErrorConstructor) {
|
|
9249
9249
|
return match;
|
9250
9250
|
});
|
9251
9251
|
|
9252
|
-
message += '\nhttp://errors.angularjs.org/1.4.
|
9252
|
+
message += '\nhttp://errors.angularjs.org/1.4.2/' +
|
9253
9253
|
(module ? module + '/' : '') + code;
|
9254
9254
|
|
9255
9255
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -9613,8 +9613,12 @@ function baseExtend(dst, objs, deep) {
|
|
9613
9613
|
var src = obj[key];
|
9614
9614
|
|
9615
9615
|
if (deep && isObject(src)) {
|
9616
|
-
if (
|
9617
|
-
|
9616
|
+
if (isDate(src)) {
|
9617
|
+
dst[key] = new Date(src.valueOf());
|
9618
|
+
} else {
|
9619
|
+
if (!isObject(dst[key])) dst[key] = isArray(src) ? [] : {};
|
9620
|
+
baseExtend(dst[key], [src], true);
|
9621
|
+
}
|
9618
9622
|
} else {
|
9619
9623
|
dst[key] = src;
|
9620
9624
|
}
|
@@ -9725,6 +9729,11 @@ identity.$inject = [];
|
|
9725
9729
|
|
9726
9730
|
function valueFn(value) {return function() {return value;};}
|
9727
9731
|
|
9732
|
+
function hasCustomToString(obj) {
|
9733
|
+
return isFunction(obj.toString) && obj.toString !== Object.prototype.toString;
|
9734
|
+
}
|
9735
|
+
|
9736
|
+
|
9728
9737
|
/**
|
9729
9738
|
* @ngdoc function
|
9730
9739
|
* @name angular.isUndefined
|
@@ -10056,9 +10065,18 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10056
10065
|
|
10057
10066
|
if (!destination) {
|
10058
10067
|
destination = source;
|
10059
|
-
if (source) {
|
10068
|
+
if (isObject(source)) {
|
10069
|
+
var index;
|
10070
|
+
if (stackSource && (index = stackSource.indexOf(source)) !== -1) {
|
10071
|
+
return stackDest[index];
|
10072
|
+
}
|
10073
|
+
|
10074
|
+
// TypedArray, Date and RegExp have specific copy functionality and must be
|
10075
|
+
// pushed onto the stack before returning.
|
10076
|
+
// Array and other objects create the base object and recurse to copy child
|
10077
|
+
// objects. The array/object will be pushed onto the stack when recursed.
|
10060
10078
|
if (isArray(source)) {
|
10061
|
-
|
10079
|
+
return copy(source, [], stackSource, stackDest);
|
10062
10080
|
} else if (isTypedArray(source)) {
|
10063
10081
|
destination = new source.constructor(source);
|
10064
10082
|
} else if (isDate(source)) {
|
@@ -10066,9 +10084,14 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10066
10084
|
} else if (isRegExp(source)) {
|
10067
10085
|
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
|
10068
10086
|
destination.lastIndex = source.lastIndex;
|
10069
|
-
} else
|
10087
|
+
} else {
|
10070
10088
|
var emptyObject = Object.create(getPrototypeOf(source));
|
10071
|
-
|
10089
|
+
return copy(source, emptyObject, stackSource, stackDest);
|
10090
|
+
}
|
10091
|
+
|
10092
|
+
if (stackDest) {
|
10093
|
+
stackSource.push(source);
|
10094
|
+
stackDest.push(destination);
|
10072
10095
|
}
|
10073
10096
|
}
|
10074
10097
|
} else {
|
@@ -10079,9 +10102,6 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10079
10102
|
stackDest = stackDest || [];
|
10080
10103
|
|
10081
10104
|
if (isObject(source)) {
|
10082
|
-
var index = stackSource.indexOf(source);
|
10083
|
-
if (index !== -1) return stackDest[index];
|
10084
|
-
|
10085
10105
|
stackSource.push(source);
|
10086
10106
|
stackDest.push(destination);
|
10087
10107
|
}
|
@@ -10090,12 +10110,7 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10090
10110
|
if (isArray(source)) {
|
10091
10111
|
destination.length = 0;
|
10092
10112
|
for (var i = 0; i < source.length; i++) {
|
10093
|
-
|
10094
|
-
if (isObject(source[i])) {
|
10095
|
-
stackSource.push(source[i]);
|
10096
|
-
stackDest.push(result);
|
10097
|
-
}
|
10098
|
-
destination.push(result);
|
10113
|
+
destination.push(copy(source[i], null, stackSource, stackDest));
|
10099
10114
|
}
|
10100
10115
|
} else {
|
10101
10116
|
var h = destination.$$hashKey;
|
@@ -10109,20 +10124,20 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10109
10124
|
if (isBlankObject(source)) {
|
10110
10125
|
// createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty
|
10111
10126
|
for (key in source) {
|
10112
|
-
|
10127
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
10113
10128
|
}
|
10114
10129
|
} else if (source && typeof source.hasOwnProperty === 'function') {
|
10115
10130
|
// Slow path, which must rely on hasOwnProperty
|
10116
10131
|
for (key in source) {
|
10117
10132
|
if (source.hasOwnProperty(key)) {
|
10118
|
-
|
10133
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
10119
10134
|
}
|
10120
10135
|
}
|
10121
10136
|
} else {
|
10122
10137
|
// Slowest path --- hasOwnProperty can't be called as a method
|
10123
10138
|
for (key in source) {
|
10124
10139
|
if (hasOwnProperty.call(source, key)) {
|
10125
|
-
|
10140
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
10126
10141
|
}
|
10127
10142
|
}
|
10128
10143
|
}
|
@@ -10130,16 +10145,6 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10130
10145
|
}
|
10131
10146
|
}
|
10132
10147
|
return destination;
|
10133
|
-
|
10134
|
-
function putValue(key, val, destination, stackSource, stackDest) {
|
10135
|
-
// No context allocation, trivial outer scope, easily inlined
|
10136
|
-
var result = copy(val, null, stackSource, stackDest);
|
10137
|
-
if (isObject(val)) {
|
10138
|
-
stackSource.push(val);
|
10139
|
-
stackDest.push(result);
|
10140
|
-
}
|
10141
|
-
destination[key] = result;
|
10142
|
-
}
|
10143
10148
|
}
|
10144
10149
|
|
10145
10150
|
/**
|
@@ -11197,7 +11202,7 @@ function setupModuleLoader(window) {
|
|
11197
11202
|
* @description
|
11198
11203
|
* See {@link auto.$provide#provider $provide.provider()}.
|
11199
11204
|
*/
|
11200
|
-
provider:
|
11205
|
+
provider: invokeLaterAndSetModuleName('$provide', 'provider'),
|
11201
11206
|
|
11202
11207
|
/**
|
11203
11208
|
* @ngdoc method
|
@@ -11208,7 +11213,7 @@ function setupModuleLoader(window) {
|
|
11208
11213
|
* @description
|
11209
11214
|
* See {@link auto.$provide#factory $provide.factory()}.
|
11210
11215
|
*/
|
11211
|
-
factory:
|
11216
|
+
factory: invokeLaterAndSetModuleName('$provide', 'factory'),
|
11212
11217
|
|
11213
11218
|
/**
|
11214
11219
|
* @ngdoc method
|
@@ -11219,7 +11224,7 @@ function setupModuleLoader(window) {
|
|
11219
11224
|
* @description
|
11220
11225
|
* See {@link auto.$provide#service $provide.service()}.
|
11221
11226
|
*/
|
11222
|
-
service:
|
11227
|
+
service: invokeLaterAndSetModuleName('$provide', 'service'),
|
11223
11228
|
|
11224
11229
|
/**
|
11225
11230
|
* @ngdoc method
|
@@ -11254,7 +11259,7 @@ function setupModuleLoader(window) {
|
|
11254
11259
|
* @description
|
11255
11260
|
* See {@link auto.$provide#decorator $provide.decorator()}.
|
11256
11261
|
*/
|
11257
|
-
decorator:
|
11262
|
+
decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),
|
11258
11263
|
|
11259
11264
|
/**
|
11260
11265
|
* @ngdoc method
|
@@ -11288,7 +11293,7 @@ function setupModuleLoader(window) {
|
|
11288
11293
|
* See {@link ng.$animateProvider#register $animateProvider.register()} and
|
11289
11294
|
* {@link ngAnimate ngAnimate module} for more information.
|
11290
11295
|
*/
|
11291
|
-
animation:
|
11296
|
+
animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),
|
11292
11297
|
|
11293
11298
|
/**
|
11294
11299
|
* @ngdoc method
|
@@ -11306,7 +11311,7 @@ function setupModuleLoader(window) {
|
|
11306
11311
|
* (`myapp_subsection_filterx`).
|
11307
11312
|
* </div>
|
11308
11313
|
*/
|
11309
|
-
filter:
|
11314
|
+
filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),
|
11310
11315
|
|
11311
11316
|
/**
|
11312
11317
|
* @ngdoc method
|
@@ -11318,7 +11323,7 @@ function setupModuleLoader(window) {
|
|
11318
11323
|
* @description
|
11319
11324
|
* See {@link ng.$controllerProvider#register $controllerProvider.register()}.
|
11320
11325
|
*/
|
11321
|
-
controller:
|
11326
|
+
controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),
|
11322
11327
|
|
11323
11328
|
/**
|
11324
11329
|
* @ngdoc method
|
@@ -11331,7 +11336,7 @@ function setupModuleLoader(window) {
|
|
11331
11336
|
* @description
|
11332
11337
|
* See {@link ng.$compileProvider#directive $compileProvider.directive()}.
|
11333
11338
|
*/
|
11334
|
-
directive:
|
11339
|
+
directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),
|
11335
11340
|
|
11336
11341
|
/**
|
11337
11342
|
* @ngdoc method
|
@@ -11381,6 +11386,19 @@ function setupModuleLoader(window) {
|
|
11381
11386
|
return moduleInstance;
|
11382
11387
|
};
|
11383
11388
|
}
|
11389
|
+
|
11390
|
+
/**
|
11391
|
+
* @param {string} provider
|
11392
|
+
* @param {string} method
|
11393
|
+
* @returns {angular.Module}
|
11394
|
+
*/
|
11395
|
+
function invokeLaterAndSetModuleName(provider, method) {
|
11396
|
+
return function(recipeName, factoryFunction) {
|
11397
|
+
if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;
|
11398
|
+
invokeQueue.push([provider, method, arguments]);
|
11399
|
+
return moduleInstance;
|
11400
|
+
};
|
11401
|
+
}
|
11384
11402
|
});
|
11385
11403
|
};
|
11386
11404
|
});
|
@@ -11524,11 +11542,11 @@ function toDebugString(obj) {
|
|
11524
11542
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11525
11543
|
*/
|
11526
11544
|
var version = {
|
11527
|
-
full: '1.4.
|
11545
|
+
full: '1.4.2', // all of these placeholder strings will be replaced by grunt's
|
11528
11546
|
major: 1, // package task
|
11529
11547
|
minor: 4,
|
11530
|
-
dot:
|
11531
|
-
codeName: '
|
11548
|
+
dot: 2,
|
11549
|
+
codeName: 'nebular-readjustment'
|
11532
11550
|
};
|
11533
11551
|
|
11534
11552
|
|
@@ -11854,6 +11872,13 @@ function jqLiteAcceptsData(node) {
|
|
11854
11872
|
return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;
|
11855
11873
|
}
|
11856
11874
|
|
11875
|
+
function jqLiteHasData(node) {
|
11876
|
+
for (var key in jqCache[node.ng339]) {
|
11877
|
+
return true;
|
11878
|
+
}
|
11879
|
+
return false;
|
11880
|
+
}
|
11881
|
+
|
11857
11882
|
function jqLiteBuildFragment(html, context) {
|
11858
11883
|
var tmp, tag, wrap,
|
11859
11884
|
fragment = context.createDocumentFragment(),
|
@@ -12228,7 +12253,8 @@ function getAliasedAttrName(element, name) {
|
|
12228
12253
|
|
12229
12254
|
forEach({
|
12230
12255
|
data: jqLiteData,
|
12231
|
-
removeData: jqLiteRemoveData
|
12256
|
+
removeData: jqLiteRemoveData,
|
12257
|
+
hasData: jqLiteHasData
|
12232
12258
|
}, function(fn, name) {
|
12233
12259
|
JQLite[name] = fn;
|
12234
12260
|
});
|
@@ -13437,7 +13463,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13437
13463
|
}));
|
13438
13464
|
|
13439
13465
|
|
13440
|
-
forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn
|
13466
|
+
forEach(loadModules(modulesToLoad), function(fn) { if (fn) instanceInjector.invoke(fn); });
|
13441
13467
|
|
13442
13468
|
return instanceInjector;
|
13443
13469
|
|
@@ -14576,7 +14602,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
14576
14602
|
|
14577
14603
|
function getHash(url) {
|
14578
14604
|
var index = url.indexOf('#');
|
14579
|
-
return index === -1 ? '' : url.substr(index
|
14605
|
+
return index === -1 ? '' : url.substr(index);
|
14580
14606
|
}
|
14581
14607
|
|
14582
14608
|
/**
|
@@ -14660,7 +14686,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
14660
14686
|
// Do the assignment again so that those two variables are referentially identical.
|
14661
14687
|
lastHistoryState = cachedState;
|
14662
14688
|
} else {
|
14663
|
-
if (!sameBase) {
|
14689
|
+
if (!sameBase || reloadLocation) {
|
14664
14690
|
reloadLocation = url;
|
14665
14691
|
}
|
14666
14692
|
if (replace) {
|
@@ -15666,13 +15692,16 @@ function $TemplateCacheProvider() {
|
|
15666
15692
|
* * `controller` - the directive's required controller instance(s) - Instances are shared
|
15667
15693
|
* among all directives, which allows the directives to use the controllers as a communication
|
15668
15694
|
* channel. The exact value depends on the directive's `require` property:
|
15695
|
+
* * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one
|
15669
15696
|
* * `string`: the controller instance
|
15670
15697
|
* * `array`: array of controller instances
|
15671
|
-
* * no controller(s) required: `undefined`
|
15672
15698
|
*
|
15673
15699
|
* If a required controller cannot be found, and it is optional, the instance is `null`,
|
15674
15700
|
* otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.
|
15675
15701
|
*
|
15702
|
+
* Note that you can also require the directive's own controller - it will be made available like
|
15703
|
+
* like any other controller.
|
15704
|
+
*
|
15676
15705
|
* * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
|
15677
15706
|
* This is the same as the `$transclude`
|
15678
15707
|
* parameter of directive controllers, see there for details.
|
@@ -16119,6 +16148,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16119
16148
|
if (isObject(bindings.isolateScope)) {
|
16120
16149
|
directive.$$isolateBindings = bindings.isolateScope;
|
16121
16150
|
}
|
16151
|
+
directive.$$moduleName = directiveFactory.$$moduleName;
|
16122
16152
|
directives.push(directive);
|
16123
16153
|
} catch (e) {
|
16124
16154
|
$exceptionHandler(e);
|
@@ -16690,8 +16720,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16690
16720
|
|
16691
16721
|
if (nodeLinkFn.transcludeOnThisElement) {
|
16692
16722
|
childBoundTranscludeFn = createBoundTranscludeFn(
|
16693
|
-
scope, nodeLinkFn.transclude, parentBoundTranscludeFn
|
16694
|
-
nodeLinkFn.elementTranscludeOnThisElement);
|
16723
|
+
scope, nodeLinkFn.transclude, parentBoundTranscludeFn);
|
16695
16724
|
|
16696
16725
|
} else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {
|
16697
16726
|
childBoundTranscludeFn = parentBoundTranscludeFn;
|
@@ -16713,7 +16742,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16713
16742
|
}
|
16714
16743
|
}
|
16715
16744
|
|
16716
|
-
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn
|
16745
|
+
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {
|
16717
16746
|
|
16718
16747
|
var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
|
16719
16748
|
|
@@ -16812,6 +16841,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16812
16841
|
}
|
16813
16842
|
break;
|
16814
16843
|
case NODE_TYPE_TEXT: /* Text Node */
|
16844
|
+
if (msie === 11) {
|
16845
|
+
// Workaround for #11781
|
16846
|
+
while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) {
|
16847
|
+
node.nodeValue = node.nodeValue + node.nextSibling.nodeValue;
|
16848
|
+
node.parentNode.removeChild(node.nextSibling);
|
16849
|
+
}
|
16850
|
+
}
|
16815
16851
|
addTextInterpolateDirective(directives, node.nodeValue);
|
16816
16852
|
break;
|
16817
16853
|
case NODE_TYPE_COMMENT: /* Comment */
|
@@ -16911,7 +16947,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16911
16947
|
previousCompileContext = previousCompileContext || {};
|
16912
16948
|
|
16913
16949
|
var terminalPriority = -Number.MAX_VALUE,
|
16914
|
-
newScopeDirective,
|
16950
|
+
newScopeDirective = previousCompileContext.newScopeDirective,
|
16915
16951
|
controllerDirectives = previousCompileContext.controllerDirectives,
|
16916
16952
|
newIsolateScopeDirective = previousCompileContext.newIsolateScopeDirective,
|
16917
16953
|
templateDirective = previousCompileContext.templateDirective,
|
@@ -17077,6 +17113,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17077
17113
|
nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
|
17078
17114
|
templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
|
17079
17115
|
controllerDirectives: controllerDirectives,
|
17116
|
+
newScopeDirective: (newScopeDirective !== directive) && newScopeDirective,
|
17080
17117
|
newIsolateScopeDirective: newIsolateScopeDirective,
|
17081
17118
|
templateDirective: templateDirective,
|
17082
17119
|
nonTlbTranscludeDirective: nonTlbTranscludeDirective
|
@@ -17104,7 +17141,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17104
17141
|
|
17105
17142
|
nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
|
17106
17143
|
nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;
|
17107
|
-
nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective;
|
17108
17144
|
nodeLinkFn.templateOnThisElement = hasTemplate;
|
17109
17145
|
nodeLinkFn.transclude = childTranscludeFn;
|
17110
17146
|
|
@@ -17265,9 +17301,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17265
17301
|
for (i in elementControllers) {
|
17266
17302
|
controller = elementControllers[i];
|
17267
17303
|
var controllerResult = controller();
|
17304
|
+
|
17268
17305
|
if (controllerResult !== controller.instance) {
|
17306
|
+
// If the controller constructor has a return value, overwrite the instance
|
17307
|
+
// from setupControllers and update the element data
|
17269
17308
|
controller.instance = controllerResult;
|
17270
|
-
$element.data('$' +
|
17309
|
+
$element.data('$' + i + 'Controller', controllerResult);
|
17271
17310
|
if (controller === controllerForBindings) {
|
17272
17311
|
// Remove and re-install bindToController bindings
|
17273
17312
|
thisLinkFn.$$destroyBindings();
|
@@ -17459,7 +17498,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17459
17498
|
|
17460
17499
|
$compileNode.empty();
|
17461
17500
|
|
17462
|
-
$templateRequest(
|
17501
|
+
$templateRequest(templateUrl)
|
17463
17502
|
.then(function(content) {
|
17464
17503
|
var compileNode, tempTemplateAttrs, $template, childBoundTranscludeFn;
|
17465
17504
|
|
@@ -17567,11 +17606,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17567
17606
|
return a.index - b.index;
|
17568
17607
|
}
|
17569
17608
|
|
17570
|
-
|
17571
17609
|
function assertNoDuplicate(what, previousDirective, directive, element) {
|
17610
|
+
|
17611
|
+
function wrapModuleNameIfDefined(moduleName) {
|
17612
|
+
return moduleName ?
|
17613
|
+
(' (module: ' + moduleName + ')') :
|
17614
|
+
'';
|
17615
|
+
}
|
17616
|
+
|
17572
17617
|
if (previousDirective) {
|
17573
|
-
throw $compileMinErr('multidir', 'Multiple directives [{0}, {
|
17574
|
-
previousDirective.name,
|
17618
|
+
throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}',
|
17619
|
+
previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName),
|
17620
|
+
directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element));
|
17575
17621
|
}
|
17576
17622
|
}
|
17577
17623
|
|
@@ -17752,26 +17798,28 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17752
17798
|
var fragment = document.createDocumentFragment();
|
17753
17799
|
fragment.appendChild(firstElementToRemove);
|
17754
17800
|
|
17755
|
-
|
17756
|
-
|
17757
|
-
|
17758
|
-
|
17759
|
-
|
17760
|
-
|
17761
|
-
|
17762
|
-
|
17763
|
-
|
17764
|
-
|
17765
|
-
|
17766
|
-
|
17767
|
-
|
17768
|
-
|
17769
|
-
|
17770
|
-
|
17771
|
-
|
17772
|
-
|
17773
|
-
|
17774
|
-
|
17801
|
+
if (jqLite.hasData(firstElementToRemove)) {
|
17802
|
+
// Copy over user data (that includes Angular's $scope etc.). Don't copy private
|
17803
|
+
// data here because there's no public interface in jQuery to do that and copying over
|
17804
|
+
// event listeners (which is the main use of private data) wouldn't work anyway.
|
17805
|
+
jqLite(newNode).data(jqLite(firstElementToRemove).data());
|
17806
|
+
|
17807
|
+
// Remove data of the replaced element. We cannot just call .remove()
|
17808
|
+
// on the element it since that would deallocate scope that is needed
|
17809
|
+
// for the new node. Instead, remove the data "manually".
|
17810
|
+
if (!jQuery) {
|
17811
|
+
delete jqLite.cache[firstElementToRemove[jqLite.expando]];
|
17812
|
+
} else {
|
17813
|
+
// jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after
|
17814
|
+
// the replaced element. The cleanData version monkey-patched by Angular would cause
|
17815
|
+
// the scope to be trashed and we do need the very same scope to work with the new
|
17816
|
+
// element. However, we cannot just cache the non-patched version and use it here as
|
17817
|
+
// that would break if another library patches the method after Angular does (one
|
17818
|
+
// example is jQuery UI). Instead, set a flag indicating scope destroying should be
|
17819
|
+
// skipped this one time.
|
17820
|
+
skipDestroyOnNextJQueryCleanData = true;
|
17821
|
+
jQuery.cleanData([firstElementToRemove]);
|
17822
|
+
}
|
17775
17823
|
}
|
17776
17824
|
|
17777
17825
|
for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {
|
@@ -17812,9 +17860,19 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17812
17860
|
lastValue,
|
17813
17861
|
parentGet, parentSet, compare;
|
17814
17862
|
|
17863
|
+
if (!hasOwnProperty.call(attrs, attrName)) {
|
17864
|
+
// In the case of user defined a binding with the same name as a method in Object.prototype but didn't set
|
17865
|
+
// the corresponding attribute. We need to make sure subsequent code won't access to the prototype function
|
17866
|
+
attrs[attrName] = undefined;
|
17867
|
+
}
|
17868
|
+
|
17815
17869
|
switch (mode) {
|
17816
17870
|
|
17817
17871
|
case '@':
|
17872
|
+
if (!attrs[attrName] && !optional) {
|
17873
|
+
destination[scopeName] = undefined;
|
17874
|
+
}
|
17875
|
+
|
17818
17876
|
attrs.$observe(attrName, function(value) {
|
17819
17877
|
destination[scopeName] = value;
|
17820
17878
|
});
|
@@ -17831,6 +17889,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17831
17889
|
return;
|
17832
17890
|
}
|
17833
17891
|
parentGet = $parse(attrs[attrName]);
|
17892
|
+
|
17834
17893
|
if (parentGet.literal) {
|
17835
17894
|
compare = equals;
|
17836
17895
|
} else {
|
@@ -17869,9 +17928,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17869
17928
|
break;
|
17870
17929
|
|
17871
17930
|
case '&':
|
17872
|
-
// Don't assign Object.prototype method to scope
|
17873
|
-
if (!attrs.hasOwnProperty(attrName) && optional) break;
|
17874
|
-
|
17875
17931
|
parentGet = $parse(attrs[attrName]);
|
17876
17932
|
|
17877
17933
|
// Don't assign noop to destination if expression is not valid
|
@@ -18272,13 +18328,17 @@ function $HttpParamSerializerProvider() {
|
|
18272
18328
|
* @name $httpParamSerializer
|
18273
18329
|
* @description
|
18274
18330
|
*
|
18275
|
-
* Default $http params serializer that converts objects to
|
18331
|
+
* Default {@link $http `$http`} params serializer that converts objects to strings
|
18276
18332
|
* according to the following rules:
|
18333
|
+
*
|
18277
18334
|
* * `{'foo': 'bar'}` results in `foo=bar`
|
18278
18335
|
* * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object)
|
18279
18336
|
* * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element)
|
18280
18337
|
* * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object)
|
18338
|
+
*
|
18339
|
+
* Note that serializer will sort the request parameters alphabetically.
|
18281
18340
|
* */
|
18341
|
+
|
18282
18342
|
this.$get = function() {
|
18283
18343
|
return function ngParamSerializer(params) {
|
18284
18344
|
if (!params) return '';
|
@@ -18305,7 +18365,43 @@ function $HttpParamSerializerJQLikeProvider() {
|
|
18305
18365
|
* @name $httpParamSerializerJQLike
|
18306
18366
|
* @description
|
18307
18367
|
*
|
18308
|
-
* Alternative $http params serializer that follows
|
18368
|
+
* Alternative {@link $http `$http`} params serializer that follows
|
18369
|
+
* jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.
|
18370
|
+
* The serializer will also sort the params alphabetically.
|
18371
|
+
*
|
18372
|
+
* To use it for serializing `$http` request parameters, set it as the `paramSerializer` property:
|
18373
|
+
*
|
18374
|
+
* ```js
|
18375
|
+
* $http({
|
18376
|
+
* url: myUrl,
|
18377
|
+
* method: 'GET',
|
18378
|
+
* params: myParams,
|
18379
|
+
* paramSerializer: '$httpParamSerializerJQLike'
|
18380
|
+
* });
|
18381
|
+
* ```
|
18382
|
+
*
|
18383
|
+
* It is also possible to set it as the default `paramSerializer` in the
|
18384
|
+
* {@link $httpProvider#defaults `$httpProvider`}.
|
18385
|
+
*
|
18386
|
+
* Additionally, you can inject the serializer and use it explicitly, for example to serialize
|
18387
|
+
* form data for submission:
|
18388
|
+
*
|
18389
|
+
* ```js
|
18390
|
+
* .controller(function($http, $httpParamSerializerJQLike) {
|
18391
|
+
* //...
|
18392
|
+
*
|
18393
|
+
* $http({
|
18394
|
+
* url: myUrl,
|
18395
|
+
* method: 'POST',
|
18396
|
+
* data: $httpParamSerializerJQLike(myData),
|
18397
|
+
* headers: {
|
18398
|
+
* 'Content-Type': 'application/x-www-form-urlencoded'
|
18399
|
+
* }
|
18400
|
+
* });
|
18401
|
+
*
|
18402
|
+
* });
|
18403
|
+
* ```
|
18404
|
+
*
|
18309
18405
|
* */
|
18310
18406
|
this.$get = function() {
|
18311
18407
|
return function jQueryLikeParamSerializer(params) {
|
@@ -18462,7 +18558,7 @@ function $HttpProvider() {
|
|
18462
18558
|
*
|
18463
18559
|
* - **`defaults.cache`** - {Object} - an object built with {@link ng.$cacheFactory `$cacheFactory`}
|
18464
18560
|
* that will provide the cache for all requests who set their `cache` property to `true`.
|
18465
|
-
* If you set the `
|
18561
|
+
* If you set the `defaults.cache = false` then only requests that specify their own custom
|
18466
18562
|
* cache object will be cached. See {@link $http#caching $http Caching} for more information.
|
18467
18563
|
*
|
18468
18564
|
* - **`defaults.xsrfCookieName`** - {string} - Name of cookie containing the XSRF token.
|
@@ -18479,10 +18575,11 @@ function $HttpProvider() {
|
|
18479
18575
|
* - **`defaults.headers.put`**
|
18480
18576
|
* - **`defaults.headers.patch`**
|
18481
18577
|
*
|
18482
|
-
*
|
18483
|
-
*
|
18484
|
-
*
|
18485
|
-
*
|
18578
|
+
*
|
18579
|
+
* - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function
|
18580
|
+
* used to the prepare string representation of request parameters (specified as an object).
|
18581
|
+
* If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.
|
18582
|
+
* Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.
|
18486
18583
|
*
|
18487
18584
|
**/
|
18488
18585
|
var defaults = this.defaults = {
|
@@ -18948,15 +19045,17 @@ function $HttpProvider() {
|
|
18948
19045
|
* properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
|
18949
19046
|
* or the per-request config object.
|
18950
19047
|
*
|
19048
|
+
* In order to prevent collisions in environments where multiple Angular apps share the
|
19049
|
+
* same domain or subdomain, we recommend that each application uses unique cookie name.
|
19050
|
+
*
|
18951
19051
|
*
|
18952
19052
|
* @param {object} config Object describing the request to be made and how it should be
|
18953
19053
|
* processed. The object has following properties:
|
18954
19054
|
*
|
18955
19055
|
* - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
|
18956
19056
|
* - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
|
18957
|
-
* - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be
|
18958
|
-
*
|
18959
|
-
* JSONified.
|
19057
|
+
* - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized
|
19058
|
+
* with the `paramSerializer` and appended as GET parameters.
|
18960
19059
|
* - **data** – `{string|Object}` – Data to be sent as the request message data.
|
18961
19060
|
* - **headers** – `{Object}` – Map of strings or functions which return strings representing
|
18962
19061
|
* HTTP headers to send to the server. If the return value of a function is null, the
|
@@ -18974,10 +19073,14 @@ function $HttpProvider() {
|
|
18974
19073
|
* transform function or an array of such functions. The transform function takes the http
|
18975
19074
|
* response body, headers and status and returns its transformed (typically deserialized) version.
|
18976
19075
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
18977
|
-
* Overriding the Default
|
18978
|
-
* - **paramSerializer** - {string|function(Object<string,string>):string} - A function used to
|
18979
|
-
* of request parameters (specified as an object).
|
18980
|
-
*
|
19076
|
+
* Overriding the Default TransformationjqLiks}
|
19077
|
+
* - **paramSerializer** - `{string|function(Object<string,string>):string}` - A function used to
|
19078
|
+
* prepare the string representation of request parameters (specified as an object).
|
19079
|
+
* If specified as string, it is interpreted as function registered with the
|
19080
|
+
* {@link $injector $injector}, which means you can create your own serializer
|
19081
|
+
* by registering it as a {@link auto.$provide#service service}.
|
19082
|
+
* The default serializer is the {@link $httpParamSerializer $httpParamSerializer};
|
19083
|
+
* alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike}
|
18981
19084
|
* - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
|
18982
19085
|
* GET request, otherwise if a cache instance built with
|
18983
19086
|
* {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
|
@@ -18988,7 +19091,7 @@ function $HttpProvider() {
|
|
18988
19091
|
* XHR object. See [requests with credentials](https://developer.mozilla.org/docs/Web/HTTP/Access_control_CORS#Requests_with_credentials)
|
18989
19092
|
* for more information.
|
18990
19093
|
* - **responseType** - `{string}` - see
|
18991
|
-
* [
|
19094
|
+
* [XMLHttpRequest.responseType](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest#xmlhttprequest-responsetype).
|
18992
19095
|
*
|
18993
19096
|
* @returns {HttpPromise} Returns a {@link ng.$q promise} object with the
|
18994
19097
|
* standard `then` method and two http specific methods: `success` and `error`. The `then`
|
@@ -20471,7 +20574,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
20471
20574
|
var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
|
20472
20575
|
var withoutHashUrl;
|
20473
20576
|
|
20474
|
-
if (withoutBaseUrl.charAt(0) === '#') {
|
20577
|
+
if (!isUndefined(withoutBaseUrl) && withoutBaseUrl.charAt(0) === '#') {
|
20475
20578
|
|
20476
20579
|
// The rest of the url starts with a hash so we have
|
20477
20580
|
// got either a hashbang path or a plain hash fragment
|
@@ -20485,7 +20588,15 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
20485
20588
|
// There was no hashbang path nor hash fragment:
|
20486
20589
|
// If we are in HTML5 mode we use what is left as the path;
|
20487
20590
|
// Otherwise we ignore what is left
|
20488
|
-
|
20591
|
+
if (this.$$html5) {
|
20592
|
+
withoutHashUrl = withoutBaseUrl;
|
20593
|
+
} else {
|
20594
|
+
withoutHashUrl = '';
|
20595
|
+
if (isUndefined(withoutBaseUrl)) {
|
20596
|
+
appBase = url;
|
20597
|
+
this.replace();
|
20598
|
+
}
|
20599
|
+
}
|
20489
20600
|
}
|
20490
20601
|
|
20491
20602
|
parseAppUrl(withoutHashUrl, this);
|
@@ -22405,8 +22516,10 @@ ASTCompiler.prototype = {
|
|
22405
22516
|
nameId.name = ast.property.name;
|
22406
22517
|
}
|
22407
22518
|
}
|
22408
|
-
|
22519
|
+
}, function() {
|
22520
|
+
self.assign(intoId, 'undefined');
|
22409
22521
|
});
|
22522
|
+
recursionFn(intoId);
|
22410
22523
|
}, !!create);
|
22411
22524
|
break;
|
22412
22525
|
case AST.CallExpression:
|
@@ -22444,8 +22557,10 @@ ASTCompiler.prototype = {
|
|
22444
22557
|
}
|
22445
22558
|
expression = self.ensureSafeObject(expression);
|
22446
22559
|
self.assign(intoId, expression);
|
22447
|
-
|
22560
|
+
}, function() {
|
22561
|
+
self.assign(intoId, 'undefined');
|
22448
22562
|
});
|
22563
|
+
recursionFn(intoId);
|
22449
22564
|
});
|
22450
22565
|
}
|
22451
22566
|
break;
|
@@ -23826,6 +23941,19 @@ function qFactory(nextTick, exceptionHandler) {
|
|
23826
23941
|
return result.promise.then(callback, errback, progressBack);
|
23827
23942
|
};
|
23828
23943
|
|
23944
|
+
/**
|
23945
|
+
* @ngdoc method
|
23946
|
+
* @name $q#resolve
|
23947
|
+
* @kind function
|
23948
|
+
*
|
23949
|
+
* @description
|
23950
|
+
* Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.
|
23951
|
+
*
|
23952
|
+
* @param {*} value Value or a promise
|
23953
|
+
* @returns {Promise} Returns a promise of the passed value or promise
|
23954
|
+
*/
|
23955
|
+
var resolve = when;
|
23956
|
+
|
23829
23957
|
/**
|
23830
23958
|
* @ngdoc method
|
23831
23959
|
* @name $q#all
|
@@ -23894,6 +24022,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
23894
24022
|
$Q.defer = defer;
|
23895
24023
|
$Q.reject = reject;
|
23896
24024
|
$Q.when = when;
|
24025
|
+
$Q.resolve = resolve;
|
23897
24026
|
$Q.all = all;
|
23898
24027
|
|
23899
24028
|
return $Q;
|
@@ -26538,12 +26667,14 @@ var $compileMinErr = minErr('$compile');
|
|
26538
26667
|
* @name $templateRequest
|
26539
26668
|
*
|
26540
26669
|
* @description
|
26541
|
-
* The `$templateRequest` service downloads the provided template using
|
26542
|
-
* stores the contents inside of `$templateCache`. If the HTTP request
|
26543
|
-
* of the HTTP request is empty, a `$compile` error will be thrown (the
|
26544
|
-
* by setting the 2nd parameter of the function to true).
|
26545
|
-
*
|
26546
|
-
*
|
26670
|
+
* The `$templateRequest` service runs security checks then downloads the provided template using
|
26671
|
+
* `$http` and, upon success, stores the contents inside of `$templateCache`. If the HTTP request
|
26672
|
+
* fails or the response data of the HTTP request is empty, a `$compile` error will be thrown (the
|
26673
|
+
* exception can be thwarted by setting the 2nd parameter of the function to true). Note that the
|
26674
|
+
* contents of `$templateCache` are trusted, so the call to `$sce.getTrustedUrl(tpl)` is omitted
|
26675
|
+
* when `tpl` is of type string and `$templateCache` has the matching entry.
|
26676
|
+
*
|
26677
|
+
* @param {string|TrustedResourceUrl} tpl The HTTP request template URL
|
26547
26678
|
* @param {boolean=} ignoreRequestError Whether or not to ignore the exception when the request fails or the template is empty
|
26548
26679
|
*
|
26549
26680
|
* @return {Promise} a promise for the HTTP response data of the given URL.
|
@@ -26551,10 +26682,19 @@ var $compileMinErr = minErr('$compile');
|
|
26551
26682
|
* @property {number} totalPendingRequests total amount of pending template requests being downloaded.
|
26552
26683
|
*/
|
26553
26684
|
function $TemplateRequestProvider() {
|
26554
|
-
this.$get = ['$templateCache', '$http', '$q', function($templateCache, $http, $q) {
|
26685
|
+
this.$get = ['$templateCache', '$http', '$q', '$sce', function($templateCache, $http, $q, $sce) {
|
26555
26686
|
function handleRequestFn(tpl, ignoreRequestError) {
|
26556
26687
|
handleRequestFn.totalPendingRequests++;
|
26557
26688
|
|
26689
|
+
// We consider the template cache holds only trusted templates, so
|
26690
|
+
// there's no need to go through whitelisting again for keys that already
|
26691
|
+
// are included in there. This also makes Angular accept any script
|
26692
|
+
// directive, no matter its name. However, we still need to unwrap trusted
|
26693
|
+
// types.
|
26694
|
+
if (!isString(tpl) || !$templateCache.get(tpl)) {
|
26695
|
+
tpl = $sce.getTrustedResourceUrl(tpl);
|
26696
|
+
}
|
26697
|
+
|
26558
26698
|
var transformResponse = $http.defaults && $http.defaults.transformResponse;
|
26559
26699
|
|
26560
26700
|
if (isArray(transformResponse)) {
|
@@ -27203,9 +27343,11 @@ function $FilterProvider($provide) {
|
|
27203
27343
|
* `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but
|
27204
27344
|
* **will** be matched by `{$: 'John'}`.
|
27205
27345
|
*
|
27206
|
-
* - `function(value, index)`: A predicate function can be used to write arbitrary filters.
|
27207
|
-
* function is called for each element of
|
27208
|
-
*
|
27346
|
+
* - `function(value, index, array)`: A predicate function can be used to write arbitrary filters.
|
27347
|
+
* The function is called for each element of the array, with the element, its index, and
|
27348
|
+
* the entire array itself as arguments.
|
27349
|
+
*
|
27350
|
+
* The final result is an array of those elements that the predicate returned true for.
|
27209
27351
|
*
|
27210
27352
|
* @param {function(actual, expected)|true|undefined} comparator Comparator which is used in
|
27211
27353
|
* determining if the expected value (from the filter expression) and actual value (from
|
@@ -27330,10 +27472,6 @@ function filterFilter() {
|
|
27330
27472
|
};
|
27331
27473
|
}
|
27332
27474
|
|
27333
|
-
function hasCustomToString(obj) {
|
27334
|
-
return isFunction(obj.toString) && obj.toString !== Object.prototype.toString;
|
27335
|
-
}
|
27336
|
-
|
27337
27475
|
// Helper functions for `filterFilter`
|
27338
27476
|
function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
27339
27477
|
var shouldMatchPrimitives = isObject(expression) && ('$' in expression);
|
@@ -27506,9 +27644,10 @@ function currencyFilter($locale) {
|
|
27506
27644
|
* @description
|
27507
27645
|
* Formats a number as text.
|
27508
27646
|
*
|
27647
|
+
* If the input is null or undefined, it will just be returned.
|
27648
|
+
* If the input is infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned.
|
27509
27649
|
* If the input is not a number an empty string is returned.
|
27510
27650
|
*
|
27511
|
-
* If the input is an infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned.
|
27512
27651
|
*
|
27513
27652
|
* @param {number|string} number Number to format.
|
27514
27653
|
* @param {(number|string)=} fractionSize Number of decimal places to round the number to.
|
@@ -28137,7 +28276,7 @@ function limitToFilter() {
|
|
28137
28276
|
* @description
|
28138
28277
|
* Orders a specified `array` by the `expression` predicate. It is ordered alphabetically
|
28139
28278
|
* for strings and numerically for numbers. Note: if you notice numbers are not being sorted
|
28140
|
-
*
|
28279
|
+
* as expected, make sure they are actually being saved as numbers and not strings.
|
28141
28280
|
*
|
28142
28281
|
* @param {Array} array The array to sort.
|
28143
28282
|
* @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be
|
@@ -28212,19 +28351,40 @@ function limitToFilter() {
|
|
28212
28351
|
{name:'Mike', phone:'555-4321', age:21},
|
28213
28352
|
{name:'Adam', phone:'555-5678', age:35},
|
28214
28353
|
{name:'Julie', phone:'555-8765', age:29}];
|
28215
|
-
$scope.predicate = '
|
28354
|
+
$scope.predicate = 'age';
|
28355
|
+
$scope.reverse = true;
|
28356
|
+
$scope.order = function(predicate) {
|
28357
|
+
$scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
|
28358
|
+
$scope.predicate = predicate;
|
28359
|
+
};
|
28216
28360
|
}]);
|
28217
28361
|
</script>
|
28362
|
+
<style type="text/css">
|
28363
|
+
.sortorder:after {
|
28364
|
+
content: '\25b2';
|
28365
|
+
}
|
28366
|
+
.sortorder.reverse:after {
|
28367
|
+
content: '\25bc';
|
28368
|
+
}
|
28369
|
+
</style>
|
28218
28370
|
<div ng-controller="ExampleController">
|
28219
28371
|
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
|
28220
28372
|
<hr/>
|
28221
28373
|
[ <a href="" ng-click="predicate=''">unsorted</a> ]
|
28222
28374
|
<table class="friend">
|
28223
28375
|
<tr>
|
28224
|
-
<th
|
28225
|
-
|
28226
|
-
|
28227
|
-
|
28376
|
+
<th>
|
28377
|
+
<a href="" ng-click="order('name')">Name</a>
|
28378
|
+
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
|
28379
|
+
</th>
|
28380
|
+
<th>
|
28381
|
+
<a href="" ng-click="order('phone')">Phone Number</a>
|
28382
|
+
<span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
|
28383
|
+
</th>
|
28384
|
+
<th>
|
28385
|
+
<a href="" ng-click="order('age')">Age</a>
|
28386
|
+
<span class="sortorder" ng-show="predicate === 'age'" ng-class="{reverse:reverse}"></span>
|
28387
|
+
</th>
|
28228
28388
|
</tr>
|
28229
28389
|
<tr ng-repeat="friend in friends | orderBy:predicate:reverse">
|
28230
28390
|
<td>{{friend.name}}</td>
|
@@ -28284,90 +28444,116 @@ function limitToFilter() {
|
|
28284
28444
|
orderByFilter.$inject = ['$parse'];
|
28285
28445
|
function orderByFilter($parse) {
|
28286
28446
|
return function(array, sortPredicate, reverseOrder) {
|
28447
|
+
|
28287
28448
|
if (!(isArrayLike(array))) return array;
|
28288
|
-
|
28449
|
+
|
28450
|
+
if (!isArray(sortPredicate)) { sortPredicate = [sortPredicate]; }
|
28289
28451
|
if (sortPredicate.length === 0) { sortPredicate = ['+']; }
|
28290
|
-
|
28291
|
-
|
28292
|
-
|
28452
|
+
|
28453
|
+
var predicates = processPredicates(sortPredicate, reverseOrder);
|
28454
|
+
|
28455
|
+
// The next three lines are a version of a Swartzian Transform idiom from Perl
|
28456
|
+
// (sometimes called the Decorate-Sort-Undecorate idiom)
|
28457
|
+
// See https://en.wikipedia.org/wiki/Schwartzian_transform
|
28458
|
+
var compareValues = Array.prototype.map.call(array, getComparisonObject);
|
28459
|
+
compareValues.sort(doComparison);
|
28460
|
+
array = compareValues.map(function(item) { return item.value; });
|
28461
|
+
|
28462
|
+
return array;
|
28463
|
+
|
28464
|
+
function getComparisonObject(value, index) {
|
28465
|
+
return {
|
28466
|
+
value: value,
|
28467
|
+
predicateValues: predicates.map(function(predicate) {
|
28468
|
+
return getPredicateValue(predicate.get(value), index);
|
28469
|
+
})
|
28470
|
+
};
|
28471
|
+
}
|
28472
|
+
|
28473
|
+
function doComparison(v1, v2) {
|
28474
|
+
var result = 0;
|
28475
|
+
for (var index=0, length = predicates.length; index < length; ++index) {
|
28476
|
+
result = compare(v1.predicateValues[index], v2.predicateValues[index]) * predicates[index].descending;
|
28477
|
+
if (result) break;
|
28478
|
+
}
|
28479
|
+
return result;
|
28480
|
+
}
|
28481
|
+
};
|
28482
|
+
|
28483
|
+
function processPredicates(sortPredicate, reverseOrder) {
|
28484
|
+
reverseOrder = reverseOrder ? -1 : 1;
|
28485
|
+
return sortPredicate.map(function(predicate) {
|
28486
|
+
var descending = 1, get = identity;
|
28487
|
+
|
28488
|
+
if (isFunction(predicate)) {
|
28489
|
+
get = predicate;
|
28490
|
+
} else if (isString(predicate)) {
|
28293
28491
|
if ((predicate.charAt(0) == '+' || predicate.charAt(0) == '-')) {
|
28294
|
-
descending = predicate.charAt(0) == '-';
|
28492
|
+
descending = predicate.charAt(0) == '-' ? -1 : 1;
|
28295
28493
|
predicate = predicate.substring(1);
|
28296
28494
|
}
|
28297
|
-
if (predicate
|
28298
|
-
|
28299
|
-
|
28300
|
-
|
28301
|
-
|
28302
|
-
|
28303
|
-
var key = get();
|
28304
|
-
return reverseComparator(function(a, b) {
|
28305
|
-
return compare(a[key], b[key]);
|
28306
|
-
}, descending);
|
28495
|
+
if (predicate !== '') {
|
28496
|
+
get = $parse(predicate);
|
28497
|
+
if (get.constant) {
|
28498
|
+
var key = get();
|
28499
|
+
get = function(value) { return value[key]; };
|
28500
|
+
}
|
28307
28501
|
}
|
28308
28502
|
}
|
28309
|
-
return
|
28310
|
-
return compare(get(a),get(b));
|
28311
|
-
}, descending);
|
28503
|
+
return { get: get, descending: descending * reverseOrder };
|
28312
28504
|
});
|
28313
|
-
|
28505
|
+
}
|
28314
28506
|
|
28315
|
-
|
28316
|
-
|
28317
|
-
|
28318
|
-
|
28319
|
-
|
28320
|
-
|
28321
|
-
|
28322
|
-
|
28323
|
-
return descending
|
28324
|
-
? function(a, b) {return comp(b,a);}
|
28325
|
-
: comp;
|
28507
|
+
function isPrimitive(value) {
|
28508
|
+
switch (typeof value) {
|
28509
|
+
case 'number': /* falls through */
|
28510
|
+
case 'boolean': /* falls through */
|
28511
|
+
case 'string':
|
28512
|
+
return true;
|
28513
|
+
default:
|
28514
|
+
return false;
|
28326
28515
|
}
|
28516
|
+
}
|
28327
28517
|
|
28328
|
-
|
28329
|
-
|
28330
|
-
|
28331
|
-
|
28332
|
-
|
28333
|
-
return true;
|
28334
|
-
default:
|
28335
|
-
return false;
|
28336
|
-
}
|
28518
|
+
function objectValue(value, index) {
|
28519
|
+
// If `valueOf` is a valid function use that
|
28520
|
+
if (typeof value.valueOf === 'function') {
|
28521
|
+
value = value.valueOf();
|
28522
|
+
if (isPrimitive(value)) return value;
|
28337
28523
|
}
|
28338
|
-
|
28339
|
-
|
28340
|
-
|
28341
|
-
if (
|
28342
|
-
value = value.valueOf();
|
28343
|
-
if (isPrimitive(value)) return value;
|
28344
|
-
}
|
28345
|
-
if (typeof value.toString === 'function') {
|
28346
|
-
value = value.toString();
|
28347
|
-
if (isPrimitive(value)) return value;
|
28348
|
-
}
|
28349
|
-
return '';
|
28524
|
+
// If `toString` is a valid function and not the one from `Object.prototype` use that
|
28525
|
+
if (hasCustomToString(value)) {
|
28526
|
+
value = value.toString();
|
28527
|
+
if (isPrimitive(value)) return value;
|
28350
28528
|
}
|
28529
|
+
// We have a basic object so we use the position of the object in the collection
|
28530
|
+
return index;
|
28531
|
+
}
|
28351
28532
|
|
28352
|
-
|
28353
|
-
|
28354
|
-
|
28355
|
-
|
28356
|
-
|
28357
|
-
|
28358
|
-
|
28359
|
-
|
28360
|
-
|
28361
|
-
|
28362
|
-
|
28363
|
-
|
28364
|
-
|
28365
|
-
|
28366
|
-
|
28367
|
-
|
28533
|
+
function getPredicateValue(value, index) {
|
28534
|
+
var type = typeof value;
|
28535
|
+
if (value === null) {
|
28536
|
+
type = 'string';
|
28537
|
+
value = 'null';
|
28538
|
+
} else if (type === 'string') {
|
28539
|
+
value = value.toLowerCase();
|
28540
|
+
} else if (type === 'object') {
|
28541
|
+
value = objectValue(value, index);
|
28542
|
+
}
|
28543
|
+
return { value: value, type: type };
|
28544
|
+
}
|
28545
|
+
|
28546
|
+
function compare(v1, v2) {
|
28547
|
+
var result = 0;
|
28548
|
+
if (v1.type === v2.type) {
|
28549
|
+
if (v1.value !== v2.value) {
|
28550
|
+
result = v1.value < v2.value ? -1 : 1;
|
28368
28551
|
}
|
28552
|
+
} else {
|
28553
|
+
result = v1.type < v2.type ? -1 : 1;
|
28369
28554
|
}
|
28370
|
-
|
28555
|
+
return result;
|
28556
|
+
}
|
28371
28557
|
}
|
28372
28558
|
|
28373
28559
|
function ngDirective(directive) {
|
@@ -28621,6 +28807,13 @@ var htmlAnchorDirective = valueFn({
|
|
28621
28807
|
* @priority 100
|
28622
28808
|
*
|
28623
28809
|
* @description
|
28810
|
+
* Sets the `checked` attribute on the element, if the expression inside `ngChecked` is truthy.
|
28811
|
+
*
|
28812
|
+
* Note that this directive should not be used together with {@link ngModel `ngModel`},
|
28813
|
+
* as this can lead to unexpected behavior.
|
28814
|
+
*
|
28815
|
+
* ### Why do we need `ngChecked`?
|
28816
|
+
*
|
28624
28817
|
* The HTML specification does not require browsers to preserve the values of boolean attributes
|
28625
28818
|
* such as checked. (Their presence means true and their absence means false.)
|
28626
28819
|
* If we put an Angular interpolation expression into such an attribute then the
|
@@ -28645,7 +28838,7 @@ var htmlAnchorDirective = valueFn({
|
|
28645
28838
|
*
|
28646
28839
|
* @element INPUT
|
28647
28840
|
* @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
|
28648
|
-
* then
|
28841
|
+
* then the `checked` attribute will be set on the element
|
28649
28842
|
*/
|
28650
28843
|
|
28651
28844
|
|
@@ -29387,7 +29580,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
29387
29580
|
var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
|
29388
29581
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
29389
29582
|
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
|
29390
|
-
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))
|
29583
|
+
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/;
|
29391
29584
|
var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;
|
29392
29585
|
var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
|
29393
29586
|
var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/;
|
@@ -29986,6 +30179,16 @@ var inputType = {
|
|
29986
30179
|
* error docs for more information and an example of how to convert your model if necessary.
|
29987
30180
|
* </div>
|
29988
30181
|
*
|
30182
|
+
* ## Issues with HTML5 constraint validation
|
30183
|
+
*
|
30184
|
+
* In browsers that follow the
|
30185
|
+
* [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),
|
30186
|
+
* `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}.
|
30187
|
+
* If a non-number is entered in the input, the browser will report the value as an empty string,
|
30188
|
+
* which means the view / model values in `ngModel` and subsequently the scope value
|
30189
|
+
* will also be an empty string.
|
30190
|
+
*
|
30191
|
+
*
|
29989
30192
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
29990
30193
|
* @param {string=} name Property name of the form under which the control is published.
|
29991
30194
|
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
@@ -30277,12 +30480,15 @@ var inputType = {
|
|
30277
30480
|
* HTML radio button.
|
30278
30481
|
*
|
30279
30482
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
30280
|
-
* @param {string} value The value to which the expression should be set when selected.
|
30483
|
+
* @param {string} value The value to which the `ngModel` expression should be set when selected.
|
30484
|
+
* Note that `value` only supports `string` values, i.e. the scope model needs to be a string,
|
30485
|
+
* too. Use `ngValue` if you need complex models (`number`, `object`, ...).
|
30281
30486
|
* @param {string=} name Property name of the form under which the control is published.
|
30282
30487
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
30283
30488
|
* interaction with the input element.
|
30284
|
-
* @param {string} ngValue Angular expression which
|
30285
|
-
* be
|
30489
|
+
* @param {string} ngValue Angular expression to which `ngModel` will be be set when the radio
|
30490
|
+
* is selected. Should be used instead of the `value` attribute if you need
|
30491
|
+
* a non-string `ngModel` (`boolean`, `array`, ...).
|
30286
30492
|
*
|
30287
30493
|
* @example
|
30288
30494
|
<example name="radio-input-directive" module="radioExample">
|
@@ -31522,7 +31728,7 @@ function classDirective(name, selector) {
|
|
31522
31728
|
* @example Example that demonstrates basic bindings via ngClass directive.
|
31523
31729
|
<example>
|
31524
31730
|
<file name="index.html">
|
31525
|
-
<p ng-class="{strike: deleted, bold: important,
|
31731
|
+
<p ng-class="{strike: deleted, bold: important, 'has-error': error}">Map Syntax Example</p>
|
31526
31732
|
<label>
|
31527
31733
|
<input type="checkbox" ng-model="deleted">
|
31528
31734
|
deleted (apply "strike" class)
|
@@ -31533,7 +31739,7 @@ function classDirective(name, selector) {
|
|
31533
31739
|
</label><br>
|
31534
31740
|
<label>
|
31535
31741
|
<input type="checkbox" ng-model="error">
|
31536
|
-
error (apply "
|
31742
|
+
error (apply "has-error" class)
|
31537
31743
|
</label>
|
31538
31744
|
<hr>
|
31539
31745
|
<p ng-class="style">Using String Syntax</p>
|
@@ -31562,6 +31768,10 @@ function classDirective(name, selector) {
|
|
31562
31768
|
.red {
|
31563
31769
|
color: red;
|
31564
31770
|
}
|
31771
|
+
.has-error {
|
31772
|
+
color: red;
|
31773
|
+
background-color: yellow;
|
31774
|
+
}
|
31565
31775
|
.orange {
|
31566
31776
|
color: orange;
|
31567
31777
|
}
|
@@ -31572,13 +31782,13 @@ function classDirective(name, selector) {
|
|
31572
31782
|
it('should let you toggle the class', function() {
|
31573
31783
|
|
31574
31784
|
expect(ps.first().getAttribute('class')).not.toMatch(/bold/);
|
31575
|
-
expect(ps.first().getAttribute('class')).not.toMatch(/
|
31785
|
+
expect(ps.first().getAttribute('class')).not.toMatch(/has-error/);
|
31576
31786
|
|
31577
31787
|
element(by.model('important')).click();
|
31578
31788
|
expect(ps.first().getAttribute('class')).toMatch(/bold/);
|
31579
31789
|
|
31580
31790
|
element(by.model('error')).click();
|
31581
|
-
expect(ps.first().getAttribute('class')).toMatch(/
|
31791
|
+
expect(ps.first().getAttribute('class')).toMatch(/has-error/);
|
31582
31792
|
});
|
31583
31793
|
|
31584
31794
|
it('should let you toggle string example', function() {
|
@@ -32706,6 +32916,7 @@ forEach(
|
|
32706
32916
|
* @ngdoc directive
|
32707
32917
|
* @name ngIf
|
32708
32918
|
* @restrict A
|
32919
|
+
* @multiElement
|
32709
32920
|
*
|
32710
32921
|
* @description
|
32711
32922
|
* The `ngIf` directive removes or recreates a portion of the DOM tree based on an
|
@@ -33004,8 +33215,8 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
33004
33215
|
* @param {Object} angularEvent Synthetic event object.
|
33005
33216
|
* @param {String} src URL of content to load.
|
33006
33217
|
*/
|
33007
|
-
var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate',
|
33008
|
-
function($templateRequest, $anchorScroll, $animate
|
33218
|
+
var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate',
|
33219
|
+
function($templateRequest, $anchorScroll, $animate) {
|
33009
33220
|
return {
|
33010
33221
|
restrict: 'ECA',
|
33011
33222
|
priority: 400,
|
@@ -33041,7 +33252,7 @@ var ngIncludeDirective = ['$templateRequest', '$anchorScroll', '$animate', '$sce
|
|
33041
33252
|
}
|
33042
33253
|
};
|
33043
33254
|
|
33044
|
-
scope.$watch(
|
33255
|
+
scope.$watch(srcExp, function ngIncludeWatchAction(src) {
|
33045
33256
|
var afterAnimation = function() {
|
33046
33257
|
if (isDefined(autoScrollExp) && (!autoScrollExp || scope.$eval(autoScrollExp))) {
|
33047
33258
|
$anchorScroll();
|
@@ -34412,7 +34623,7 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
|
|
34412
34623
|
* - `debounce`: integer value which contains the debounce model update value in milliseconds. A
|
34413
34624
|
* value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
|
34414
34625
|
* custom value for each event. For example:
|
34415
|
-
* `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"`
|
34626
|
+
* `ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"`
|
34416
34627
|
* - `allowInvalid`: boolean value which indicates that the model can be set with values that did
|
34417
34628
|
* not validate correctly instead of the default behavior of setting the model to undefined.
|
34418
34629
|
* - `getterSetter`: boolean value which determines whether or not to treat functions bound to
|
@@ -34662,7 +34873,9 @@ function addSetValidityMethod(context) {
|
|
34662
34873
|
function isObjectEmpty(obj) {
|
34663
34874
|
if (obj) {
|
34664
34875
|
for (var prop in obj) {
|
34665
|
-
|
34876
|
+
if (obj.hasOwnProperty(prop)) {
|
34877
|
+
return false;
|
34878
|
+
}
|
34666
34879
|
}
|
34667
34880
|
}
|
34668
34881
|
return true;
|
@@ -34994,19 +35207,41 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
34994
35207
|
this.disabled = disabled;
|
34995
35208
|
}
|
34996
35209
|
|
35210
|
+
function getOptionValuesKeys(optionValues) {
|
35211
|
+
var optionValuesKeys;
|
35212
|
+
|
35213
|
+
if (!keyName && isArrayLike(optionValues)) {
|
35214
|
+
optionValuesKeys = optionValues;
|
35215
|
+
} else {
|
35216
|
+
// if object, extract keys, in enumeration order, unsorted
|
35217
|
+
optionValuesKeys = [];
|
35218
|
+
for (var itemKey in optionValues) {
|
35219
|
+
if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {
|
35220
|
+
optionValuesKeys.push(itemKey);
|
35221
|
+
}
|
35222
|
+
}
|
35223
|
+
}
|
35224
|
+
return optionValuesKeys;
|
35225
|
+
}
|
35226
|
+
|
34997
35227
|
return {
|
34998
35228
|
trackBy: trackBy,
|
34999
35229
|
getTrackByValue: getTrackByValue,
|
35000
|
-
getWatchables: $parse(valuesFn, function(
|
35230
|
+
getWatchables: $parse(valuesFn, function(optionValues) {
|
35001
35231
|
// Create a collection of things that we would like to watch (watchedArray)
|
35002
35232
|
// so that they can all be watched using a single $watchCollection
|
35003
35233
|
// that only runs the handler once if anything changes
|
35004
35234
|
var watchedArray = [];
|
35005
|
-
|
35235
|
+
optionValues = optionValues || [];
|
35236
|
+
|
35237
|
+
var optionValuesKeys = getOptionValuesKeys(optionValues);
|
35238
|
+
var optionValuesLength = optionValuesKeys.length;
|
35239
|
+
for (var index = 0; index < optionValuesLength; index++) {
|
35240
|
+
var key = (optionValues === optionValuesKeys) ? index : optionValuesKeys[index];
|
35241
|
+
var value = optionValues[key];
|
35006
35242
|
|
35007
|
-
|
35008
|
-
var
|
35009
|
-
var selectValue = getTrackByValueFn(values[key], locals);
|
35243
|
+
var locals = getLocals(optionValues[key], key);
|
35244
|
+
var selectValue = getTrackByValueFn(optionValues[key], locals);
|
35010
35245
|
watchedArray.push(selectValue);
|
35011
35246
|
|
35012
35247
|
// Only need to watch the displayFn if there is a specific label expression
|
@@ -35020,7 +35255,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35020
35255
|
var disableWhen = disableWhenFn(scope, locals);
|
35021
35256
|
watchedArray.push(disableWhen);
|
35022
35257
|
}
|
35023
|
-
}
|
35258
|
+
}
|
35024
35259
|
return watchedArray;
|
35025
35260
|
}),
|
35026
35261
|
|
@@ -35032,21 +35267,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35032
35267
|
// The option values were already computed in the `getWatchables` fn,
|
35033
35268
|
// which must have been called to trigger `getOptions`
|
35034
35269
|
var optionValues = valuesFn(scope) || [];
|
35035
|
-
var optionValuesKeys;
|
35036
|
-
|
35037
|
-
|
35038
|
-
if (!keyName && isArrayLike(optionValues)) {
|
35039
|
-
optionValuesKeys = optionValues;
|
35040
|
-
} else {
|
35041
|
-
// if object, extract keys, in enumeration order, unsorted
|
35042
|
-
optionValuesKeys = [];
|
35043
|
-
for (var itemKey in optionValues) {
|
35044
|
-
if (optionValues.hasOwnProperty(itemKey) && itemKey.charAt(0) !== '$') {
|
35045
|
-
optionValuesKeys.push(itemKey);
|
35046
|
-
}
|
35047
|
-
}
|
35048
|
-
}
|
35049
|
-
|
35270
|
+
var optionValuesKeys = getOptionValuesKeys(optionValues);
|
35050
35271
|
var optionValuesLength = optionValuesKeys.length;
|
35051
35272
|
|
35052
35273
|
for (var index = 0; index < optionValuesLength; index++) {
|
@@ -35408,8 +35629,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35408
35629
|
// Check to see if the value has changed due to the update to the options
|
35409
35630
|
if (!ngModelCtrl.$isEmpty(previousValue)) {
|
35410
35631
|
var nextValue = selectCtrl.readValue();
|
35411
|
-
if (ngOptions.trackBy
|
35412
|
-
previousValue !== nextValue) {
|
35632
|
+
if (ngOptions.trackBy ? !equals(previousValue, nextValue) : previousValue !== nextValue) {
|
35413
35633
|
ngModelCtrl.$setViewValue(nextValue);
|
35414
35634
|
ngModelCtrl.$render();
|
35415
35635
|
}
|
@@ -35663,6 +35883,7 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
35663
35883
|
/**
|
35664
35884
|
* @ngdoc directive
|
35665
35885
|
* @name ngRepeat
|
35886
|
+
* @multiElement
|
35666
35887
|
*
|
35667
35888
|
* @description
|
35668
35889
|
* The `ngRepeat` directive instantiates a template once per item from a collection. Each template
|
@@ -35757,6 +35978,15 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
35757
35978
|
* </div>
|
35758
35979
|
* ```
|
35759
35980
|
*
|
35981
|
+
* <div class="alert alert-warning">
|
35982
|
+
* **Note:** `track by` must always be the last expression:
|
35983
|
+
* </div>
|
35984
|
+
* ```
|
35985
|
+
* <div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
|
35986
|
+
* {{model.name}}
|
35987
|
+
* </div>
|
35988
|
+
* ```
|
35989
|
+
*
|
35760
35990
|
* # Special repeat start and end points
|
35761
35991
|
* To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
|
35762
35992
|
* the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
|
@@ -35828,8 +36058,9 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
35828
36058
|
* which can be used to associate the objects in the collection with the DOM elements. If no tracking expression
|
35829
36059
|
* is specified, ng-repeat associates elements by identity. It is an error to have
|
35830
36060
|
* more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are
|
35831
|
-
* mapped to the same DOM element, which is not possible.)
|
35832
|
-
*
|
36061
|
+
* mapped to the same DOM element, which is not possible.)
|
36062
|
+
*
|
36063
|
+
* Note that the tracking expression must come last, after any filters, and the alias expression.
|
35833
36064
|
*
|
35834
36065
|
* For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
|
35835
36066
|
* will be associated by item identity in the array.
|
@@ -36182,6 +36413,7 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
36182
36413
|
/**
|
36183
36414
|
* @ngdoc directive
|
36184
36415
|
* @name ngShow
|
36416
|
+
* @multiElement
|
36185
36417
|
*
|
36186
36418
|
* @description
|
36187
36419
|
* The `ngShow` directive shows or hides the given HTML element based on the expression
|
@@ -36357,6 +36589,7 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
36357
36589
|
/**
|
36358
36590
|
* @ngdoc directive
|
36359
36591
|
* @name ngHide
|
36592
|
+
* @multiElement
|
36360
36593
|
*
|
36361
36594
|
* @description
|
36362
36595
|
* The `ngHide` directive shows or hides the given HTML element based on the expression
|