angularjs-rails 1.3.6 → 1.3.8
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 +3 -2
- data/vendor/assets/javascripts/angular-aria.js +20 -13
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +15 -15
- data/vendor/assets/javascripts/angular-resource.js +2 -2
- data/vendor/assets/javascripts/angular-route.js +1 -1
- data/vendor/assets/javascripts/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/angular-scenario.js +223 -153
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +223 -153
- data/vendor/assets/javascripts/unstable/angular-animate.js +3 -2
- data/vendor/assets/javascripts/unstable/angular-aria.js +20 -13
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +15 -15
- data/vendor/assets/javascripts/unstable/angular-resource.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-route.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-scenario.js +223 -153
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +223 -153
- metadata +1 -1
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.8
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -839,7 +839,8 @@ angular.module('ngAnimate', ['ng'])
|
|
839
839
|
* promise that was returned when the animation was started.
|
840
840
|
*
|
841
841
|
* ```js
|
842
|
-
* var promise = $animate.addClass(element, 'super-long-animation')
|
842
|
+
* var promise = $animate.addClass(element, 'super-long-animation');
|
843
|
+
* promise.then(function() {
|
843
844
|
* //this will still be called even if cancelled
|
844
845
|
* });
|
845
846
|
*
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.8
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -302,21 +302,28 @@ ngAriaModule.directive('ngShow', ['$aria', function($aria) {
|
|
302
302
|
}
|
303
303
|
};
|
304
304
|
})
|
305
|
-
.directive('ngClick',['$aria', function($aria) {
|
305
|
+
.directive('ngClick',['$aria', '$parse', function($aria, $parse) {
|
306
306
|
return {
|
307
307
|
restrict: 'A',
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
|
308
|
+
compile: function(elem, attr) {
|
309
|
+
var fn = $parse(attr.ngClick, /* interceptorFn */ null, /* expensiveChecks */ true);
|
310
|
+
return function(scope, elem, attr) {
|
311
|
+
if ($aria.config('tabindex') && !elem.attr('tabindex')) {
|
312
|
+
elem.attr('tabindex', 0);
|
313
|
+
}
|
312
314
|
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
315
|
+
if ($aria.config('bindKeypress') && !attr.ngKeypress) {
|
316
|
+
elem.on('keypress', function(event) {
|
317
|
+
if (event.keyCode === 32 || event.keyCode === 13) {
|
318
|
+
scope.$apply(callback);
|
319
|
+
}
|
320
|
+
|
321
|
+
function callback() {
|
322
|
+
fn(scope, { $event: event });
|
323
|
+
}
|
324
|
+
});
|
325
|
+
}
|
326
|
+
};
|
320
327
|
}
|
321
328
|
};
|
322
329
|
}])
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.8
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -55,7 +55,7 @@ function minErr(module, ErrorConstructor) {
|
|
55
55
|
return match;
|
56
56
|
});
|
57
57
|
|
58
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
58
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.8/' +
|
59
59
|
(module ? module + '/' : '') + code;
|
60
60
|
for (i = 2; i < arguments.length; i++) {
|
61
61
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.8
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1283,7 +1283,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1283
1283
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1284
1284
|
* and returns true if the url match the current definition.
|
1285
1285
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1286
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1286
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1287
1287
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1288
1288
|
* order to change how a matched request is handled.
|
1289
1289
|
*/
|
@@ -1297,7 +1297,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1297
1297
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1298
1298
|
* and returns true if the url match the current definition.
|
1299
1299
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1300
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1300
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1301
1301
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1302
1302
|
* order to change how a matched request is handled.
|
1303
1303
|
*/
|
@@ -1311,7 +1311,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1311
1311
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1312
1312
|
* and returns true if the url match the current definition.
|
1313
1313
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1314
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1314
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1315
1315
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1316
1316
|
* order to change how a matched request is handled.
|
1317
1317
|
*/
|
@@ -1327,7 +1327,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1327
1327
|
* @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
|
1328
1328
|
* data string and returns true if the data is as expected.
|
1329
1329
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1330
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1330
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1331
1331
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1332
1332
|
* order to change how a matched request is handled.
|
1333
1333
|
*/
|
@@ -1343,7 +1343,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1343
1343
|
* @param {(string|RegExp|function(string))=} data HTTP request body or function that receives
|
1344
1344
|
* data string and returns true if the data is as expected.
|
1345
1345
|
* @param {(Object|function(Object))=} headers HTTP headers.
|
1346
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1346
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1347
1347
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1348
1348
|
* order to change how a matched request is handled.
|
1349
1349
|
*/
|
@@ -1356,7 +1356,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1356
1356
|
*
|
1357
1357
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1358
1358
|
* and returns true if the url match the current definition.
|
1359
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1359
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1360
1360
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1361
1361
|
* order to change how a matched request is handled.
|
1362
1362
|
*/
|
@@ -1377,7 +1377,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1377
1377
|
* is in JSON format.
|
1378
1378
|
* @param {(Object|function(Object))=} headers HTTP headers or function that receives http header
|
1379
1379
|
* object and returns true if the headers match the current expectation.
|
1380
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1380
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1381
1381
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1382
1382
|
* order to change how a matched request is handled.
|
1383
1383
|
*
|
@@ -1412,7 +1412,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1412
1412
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1413
1413
|
* and returns true if the url match the current definition.
|
1414
1414
|
* @param {Object=} headers HTTP headers.
|
1415
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1415
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1416
1416
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1417
1417
|
* order to change how a matched request is handled. See #expect for more info.
|
1418
1418
|
*/
|
@@ -1426,7 +1426,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1426
1426
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1427
1427
|
* and returns true if the url match the current definition.
|
1428
1428
|
* @param {Object=} headers HTTP headers.
|
1429
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1429
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1430
1430
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1431
1431
|
* order to change how a matched request is handled.
|
1432
1432
|
*/
|
@@ -1440,7 +1440,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1440
1440
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1441
1441
|
* and returns true if the url match the current definition.
|
1442
1442
|
* @param {Object=} headers HTTP headers.
|
1443
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1443
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1444
1444
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1445
1445
|
* order to change how a matched request is handled.
|
1446
1446
|
*/
|
@@ -1457,7 +1457,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1457
1457
|
* receives data string and returns true if the data is as expected, or Object if request body
|
1458
1458
|
* is in JSON format.
|
1459
1459
|
* @param {Object=} headers HTTP headers.
|
1460
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1460
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1461
1461
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1462
1462
|
* order to change how a matched request is handled.
|
1463
1463
|
*/
|
@@ -1474,7 +1474,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1474
1474
|
* receives data string and returns true if the data is as expected, or Object if request body
|
1475
1475
|
* is in JSON format.
|
1476
1476
|
* @param {Object=} headers HTTP headers.
|
1477
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1477
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1478
1478
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1479
1479
|
* order to change how a matched request is handled.
|
1480
1480
|
*/
|
@@ -1491,7 +1491,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1491
1491
|
* receives data string and returns true if the data is as expected, or Object if request body
|
1492
1492
|
* is in JSON format.
|
1493
1493
|
* @param {Object=} headers HTTP headers.
|
1494
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1494
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1495
1495
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1496
1496
|
* order to change how a matched request is handled.
|
1497
1497
|
*/
|
@@ -1504,7 +1504,7 @@ function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
|
1504
1504
|
*
|
1505
1505
|
* @param {string|RegExp|function(string)} url HTTP url or function that receives the url
|
1506
1506
|
* and returns true if the url match the current definition.
|
1507
|
-
* @returns {requestHandler} Returns an object with `respond` method that
|
1507
|
+
* @returns {requestHandler} Returns an object with `respond` method that controls how a matched
|
1508
1508
|
* request is handled. You can save this object for later use and invoke `respond` again in
|
1509
1509
|
* order to change how a matched request is handled.
|
1510
1510
|
*/
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.8
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -116,7 +116,7 @@ function shallowClearAndCopy(src, dst) {
|
|
116
116
|
* example, if the `defaultParam` object is `{someParam: '@someProp'}` then the value of `someParam`
|
117
117
|
* will be `data.someProp`.
|
118
118
|
*
|
119
|
-
* @param {Object.<Object>=} actions Hash with declaration of custom
|
119
|
+
* @param {Object.<Object>=} actions Hash with declaration of custom actions that should extend
|
120
120
|
* the default set of resource actions. The declaration should be created in the format of {@link
|
121
121
|
* ng.$http#usage $http.config}:
|
122
122
|
*
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.3.
|
9193
|
+
* @license AngularJS v1.3.8
|
9194
9194
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9246,7 +9246,7 @@ function minErr(module, ErrorConstructor) {
|
|
9246
9246
|
return match;
|
9247
9247
|
});
|
9248
9248
|
|
9249
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
9249
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.8/' +
|
9250
9250
|
(module ? module + '/' : '') + code;
|
9251
9251
|
for (i = 2; i < arguments.length; i++) {
|
9252
9252
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -9301,6 +9301,7 @@ function minErr(module, ErrorConstructor) {
|
|
9301
9301
|
isWindow: true,
|
9302
9302
|
isScope: true,
|
9303
9303
|
isFile: true,
|
9304
|
+
isFormData: true,
|
9304
9305
|
isBlob: true,
|
9305
9306
|
isBoolean: true,
|
9306
9307
|
isPromiseLike: true,
|
@@ -9656,6 +9657,8 @@ noop.$inject = [];
|
|
9656
9657
|
return (transformationFn || angular.identity)(value);
|
9657
9658
|
};
|
9658
9659
|
```
|
9660
|
+
* @param {*} value to be returned.
|
9661
|
+
* @returns {*} the value passed in.
|
9659
9662
|
*/
|
9660
9663
|
function identity($) {return $;}
|
9661
9664
|
identity.$inject = [];
|
@@ -9822,6 +9825,11 @@ function isFile(obj) {
|
|
9822
9825
|
}
|
9823
9826
|
|
9824
9827
|
|
9828
|
+
function isFormData(obj) {
|
9829
|
+
return toString.call(obj) === '[object FormData]';
|
9830
|
+
}
|
9831
|
+
|
9832
|
+
|
9825
9833
|
function isBlob(obj) {
|
9826
9834
|
return toString.call(obj) === '[object Blob]';
|
9827
9835
|
}
|
@@ -9905,7 +9913,7 @@ function arrayRemove(array, value) {
|
|
9905
9913
|
* Creates a deep copy of `source`, which should be an object or an array.
|
9906
9914
|
*
|
9907
9915
|
* * If no destination is supplied, a copy of the object or array is created.
|
9908
|
-
* * If a destination is provided, all of its elements (for
|
9916
|
+
* * If a destination is provided, all of its elements (for arrays) or properties (for objects)
|
9909
9917
|
* are deleted and then all elements/properties from the source are copied to it.
|
9910
9918
|
* * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
|
9911
9919
|
* * If `source` is identical to 'destination' an exception will be thrown.
|
@@ -10243,7 +10251,7 @@ function toJson(obj, pretty) {
|
|
10243
10251
|
* Deserializes a JSON string.
|
10244
10252
|
*
|
10245
10253
|
* @param {string} json JSON string to deserialize.
|
10246
|
-
* @returns {Object|Array|string|number} Deserialized
|
10254
|
+
* @returns {Object|Array|string|number} Deserialized JSON string.
|
10247
10255
|
*/
|
10248
10256
|
function fromJson(json) {
|
10249
10257
|
return isString(json)
|
@@ -10416,7 +10424,7 @@ function getNgAttribute(element, ngAttr) {
|
|
10416
10424
|
* {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
|
10417
10425
|
*
|
10418
10426
|
* You can specify an **AngularJS module** to be used as the root module for the application. This
|
10419
|
-
* module will be loaded into the {@link auto.$injector} when the application is bootstrapped
|
10427
|
+
* module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It
|
10420
10428
|
* should contain the application code needed or have dependencies on other modules that will
|
10421
10429
|
* contain the code. See {@link angular.module} for more information.
|
10422
10430
|
*
|
@@ -10424,7 +10432,7 @@ function getNgAttribute(element, ngAttr) {
|
|
10424
10432
|
* document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
|
10425
10433
|
* would not be resolved to `3`.
|
10426
10434
|
*
|
10427
|
-
* `ngApp` is the easiest, and most common
|
10435
|
+
* `ngApp` is the easiest, and most common way to bootstrap an application.
|
10428
10436
|
*
|
10429
10437
|
<example module="ngAppDemo">
|
10430
10438
|
<file name="index.html">
|
@@ -10684,7 +10692,12 @@ function reloadWithDebugInfo() {
|
|
10684
10692
|
* @param {DOMElement} element DOM element which is the root of angular application.
|
10685
10693
|
*/
|
10686
10694
|
function getTestability(rootElement) {
|
10687
|
-
|
10695
|
+
var injector = angular.element(rootElement).injector();
|
10696
|
+
if (!injector) {
|
10697
|
+
throw ngMinErr('test',
|
10698
|
+
'no injector found for element argument to getTestability');
|
10699
|
+
}
|
10700
|
+
return injector.get('$$testability');
|
10688
10701
|
}
|
10689
10702
|
|
10690
10703
|
var SNAKE_CASE_REGEXP = /[A-Z]/g;
|
@@ -11297,11 +11310,11 @@ function toDebugString(obj) {
|
|
11297
11310
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11298
11311
|
*/
|
11299
11312
|
var version = {
|
11300
|
-
full: '1.3.
|
11313
|
+
full: '1.3.8', // all of these placeholder strings will be replaced by grunt's
|
11301
11314
|
major: 1, // package task
|
11302
11315
|
minor: 3,
|
11303
|
-
dot:
|
11304
|
-
codeName: '
|
11316
|
+
dot: 8,
|
11317
|
+
codeName: 'prophetic-narwhal'
|
11305
11318
|
};
|
11306
11319
|
|
11307
11320
|
|
@@ -16314,7 +16327,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16314
16327
|
// support ngAttr attribute binding
|
16315
16328
|
ngAttrName = directiveNormalize(name);
|
16316
16329
|
if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
|
16317
|
-
name =
|
16330
|
+
name = name.replace(PREFIX_REGEXP, '')
|
16331
|
+
.substr(8).replace(/_(.)/g, function(match, letter) {
|
16332
|
+
return letter.toUpperCase();
|
16333
|
+
});
|
16318
16334
|
}
|
16319
16335
|
|
16320
16336
|
var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
|
@@ -17226,7 +17242,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17226
17242
|
|
17227
17243
|
|
17228
17244
|
function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {
|
17229
|
-
var
|
17245
|
+
var trustedContext = getTrustedContext(node, name);
|
17246
|
+
allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing;
|
17247
|
+
|
17248
|
+
var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing);
|
17230
17249
|
|
17231
17250
|
// no interpolation found -> ignore
|
17232
17251
|
if (!interpolateFn) return;
|
@@ -17251,16 +17270,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17251
17270
|
"ng- versions (such as ng-click instead of onclick) instead.");
|
17252
17271
|
}
|
17253
17272
|
|
17254
|
-
// If the attribute
|
17255
|
-
|
17256
|
-
|
17273
|
+
// If the attribute has changed since last $interpolate()ed
|
17274
|
+
var newValue = attr[name];
|
17275
|
+
if (newValue !== value) {
|
17276
|
+
// we need to interpolate again since the attribute value has been updated
|
17277
|
+
// (e.g. by another directive's compile function)
|
17278
|
+
// ensure unset/empty values make interpolateFn falsy
|
17279
|
+
interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);
|
17280
|
+
value = newValue;
|
17257
17281
|
}
|
17258
17282
|
|
17259
|
-
// we need to interpolate again, in case the attribute value has been updated
|
17260
|
-
// (e.g. by another directive's compile function)
|
17261
|
-
interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),
|
17262
|
-
ALL_OR_NOTHING_ATTRS[name] || allOrNothing);
|
17263
|
-
|
17264
17283
|
// if attribute was updated so that there is no interpolation going on we don't want to
|
17265
17284
|
// register any observers
|
17266
17285
|
if (!interpolateFn) return;
|
@@ -17721,23 +17740,34 @@ function $ExceptionHandlerProvider() {
|
|
17721
17740
|
|
17722
17741
|
var APPLICATION_JSON = 'application/json';
|
17723
17742
|
var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
|
17724
|
-
var JSON_START = /^\
|
17725
|
-
var
|
17743
|
+
var JSON_START = /^\[|^\{(?!\{)/;
|
17744
|
+
var JSON_ENDS = {
|
17745
|
+
'[': /]$/,
|
17746
|
+
'{': /}$/
|
17747
|
+
};
|
17726
17748
|
var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
|
17727
17749
|
|
17728
17750
|
function defaultHttpResponseTransform(data, headers) {
|
17729
17751
|
if (isString(data)) {
|
17730
|
-
//
|
17731
|
-
|
17732
|
-
|
17733
|
-
if (
|
17734
|
-
|
17735
|
-
|
17752
|
+
// Strip json vulnerability protection prefix and trim whitespace
|
17753
|
+
var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();
|
17754
|
+
|
17755
|
+
if (tempData) {
|
17756
|
+
var contentType = headers('Content-Type');
|
17757
|
+
if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {
|
17758
|
+
data = fromJson(tempData);
|
17759
|
+
}
|
17736
17760
|
}
|
17737
17761
|
}
|
17762
|
+
|
17738
17763
|
return data;
|
17739
17764
|
}
|
17740
17765
|
|
17766
|
+
function isJsonLike(str) {
|
17767
|
+
var jsonStart = str.match(JSON_START);
|
17768
|
+
return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
|
17769
|
+
}
|
17770
|
+
|
17741
17771
|
/**
|
17742
17772
|
* Parse headers into key value object
|
17743
17773
|
*
|
@@ -17800,16 +17830,17 @@ function headersGetter(headers) {
|
|
17800
17830
|
* This function is used for both request and response transforming
|
17801
17831
|
*
|
17802
17832
|
* @param {*} data Data to transform.
|
17803
|
-
* @param {function(string=)} headers
|
17833
|
+
* @param {function(string=)} headers HTTP headers getter fn.
|
17834
|
+
* @param {number} status HTTP status code of the response.
|
17804
17835
|
* @param {(Function|Array.<Function>)} fns Function or an array of functions.
|
17805
17836
|
* @returns {*} Transformed data.
|
17806
17837
|
*/
|
17807
|
-
function transformData(data, headers, fns) {
|
17838
|
+
function transformData(data, headers, status, fns) {
|
17808
17839
|
if (isFunction(fns))
|
17809
|
-
return fns(data, headers);
|
17840
|
+
return fns(data, headers, status);
|
17810
17841
|
|
17811
17842
|
forEach(fns, function(fn) {
|
17812
|
-
data = fn(data, headers);
|
17843
|
+
data = fn(data, headers, status);
|
17813
17844
|
});
|
17814
17845
|
|
17815
17846
|
return data;
|
@@ -17861,7 +17892,7 @@ function $HttpProvider() {
|
|
17861
17892
|
|
17862
17893
|
// transform outgoing request data
|
17863
17894
|
transformRequest: [function(d) {
|
17864
|
-
return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
|
17895
|
+
return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;
|
17865
17896
|
}],
|
17866
17897
|
|
17867
17898
|
// default headers
|
@@ -18088,7 +18119,7 @@ function $HttpProvider() {
|
|
18088
18119
|
*
|
18089
18120
|
* Both requests and responses can be transformed using transformation functions: `transformRequest`
|
18090
18121
|
* and `transformResponse`. These properties can be a single function that returns
|
18091
|
-
* the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions,
|
18122
|
+
* the transformed value (`{function(data, headersGetter, status)`) or an array of such transformation functions,
|
18092
18123
|
* which allows you to `push` or `unshift` a new transformation function into the transformation chain.
|
18093
18124
|
*
|
18094
18125
|
* ### Default Transformations
|
@@ -18332,9 +18363,9 @@ function $HttpProvider() {
|
|
18332
18363
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
18333
18364
|
* Overriding the Default Transformations}
|
18334
18365
|
* - **transformResponse** –
|
18335
|
-
* `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
|
18366
|
+
* `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –
|
18336
18367
|
* transform function or an array of such functions. The transform function takes the http
|
18337
|
-
* response body and
|
18368
|
+
* response body, headers and status and returns its transformed (typically deserialized) version.
|
18338
18369
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
18339
18370
|
* Overriding the Default Transformations}
|
18340
18371
|
* - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
|
@@ -18457,24 +18488,23 @@ function $HttpProvider() {
|
|
18457
18488
|
</example>
|
18458
18489
|
*/
|
18459
18490
|
function $http(requestConfig) {
|
18460
|
-
var config = {
|
18461
|
-
method: 'get',
|
18462
|
-
transformRequest: defaults.transformRequest,
|
18463
|
-
transformResponse: defaults.transformResponse
|
18464
|
-
};
|
18465
|
-
var headers = mergeHeaders(requestConfig);
|
18466
18491
|
|
18467
18492
|
if (!angular.isObject(requestConfig)) {
|
18468
18493
|
throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig);
|
18469
18494
|
}
|
18470
18495
|
|
18471
|
-
extend(
|
18472
|
-
|
18496
|
+
var config = extend({
|
18497
|
+
method: 'get',
|
18498
|
+
transformRequest: defaults.transformRequest,
|
18499
|
+
transformResponse: defaults.transformResponse
|
18500
|
+
}, requestConfig);
|
18501
|
+
|
18502
|
+
config.headers = mergeHeaders(requestConfig);
|
18473
18503
|
config.method = uppercase(config.method);
|
18474
18504
|
|
18475
18505
|
var serverRequest = function(config) {
|
18476
|
-
headers = config.headers;
|
18477
|
-
var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
|
18506
|
+
var headers = config.headers;
|
18507
|
+
var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);
|
18478
18508
|
|
18479
18509
|
// strip content-type if data is undefined
|
18480
18510
|
if (isUndefined(reqData)) {
|
@@ -18490,7 +18520,7 @@ function $HttpProvider() {
|
|
18490
18520
|
}
|
18491
18521
|
|
18492
18522
|
// send request
|
18493
|
-
return sendReq(config, reqData
|
18523
|
+
return sendReq(config, reqData).then(transformResponse, transformResponse);
|
18494
18524
|
};
|
18495
18525
|
|
18496
18526
|
var chain = [serverRequest, undefined];
|
@@ -18535,13 +18565,30 @@ function $HttpProvider() {
|
|
18535
18565
|
if (!response.data) {
|
18536
18566
|
resp.data = response.data;
|
18537
18567
|
} else {
|
18538
|
-
resp.data = transformData(response.data, response.headers, config.transformResponse);
|
18568
|
+
resp.data = transformData(response.data, response.headers, response.status, config.transformResponse);
|
18539
18569
|
}
|
18540
18570
|
return (isSuccess(response.status))
|
18541
18571
|
? resp
|
18542
18572
|
: $q.reject(resp);
|
18543
18573
|
}
|
18544
18574
|
|
18575
|
+
function executeHeaderFns(headers) {
|
18576
|
+
var headerContent, processedHeaders = {};
|
18577
|
+
|
18578
|
+
forEach(headers, function(headerFn, header) {
|
18579
|
+
if (isFunction(headerFn)) {
|
18580
|
+
headerContent = headerFn();
|
18581
|
+
if (headerContent != null) {
|
18582
|
+
processedHeaders[header] = headerContent;
|
18583
|
+
}
|
18584
|
+
} else {
|
18585
|
+
processedHeaders[header] = headerFn;
|
18586
|
+
}
|
18587
|
+
});
|
18588
|
+
|
18589
|
+
return processedHeaders;
|
18590
|
+
}
|
18591
|
+
|
18545
18592
|
function mergeHeaders(config) {
|
18546
18593
|
var defHeaders = defaults.headers,
|
18547
18594
|
reqHeaders = extend({}, config.headers),
|
@@ -18564,23 +18611,7 @@ function $HttpProvider() {
|
|
18564
18611
|
}
|
18565
18612
|
|
18566
18613
|
// execute if header value is a function for merged headers
|
18567
|
-
|
18568
|
-
return reqHeaders;
|
18569
|
-
|
18570
|
-
function execHeaders(headers) {
|
18571
|
-
var headerContent;
|
18572
|
-
|
18573
|
-
forEach(headers, function(headerFn, header) {
|
18574
|
-
if (isFunction(headerFn)) {
|
18575
|
-
headerContent = headerFn();
|
18576
|
-
if (headerContent != null) {
|
18577
|
-
headers[header] = headerContent;
|
18578
|
-
} else {
|
18579
|
-
delete headers[header];
|
18580
|
-
}
|
18581
|
-
}
|
18582
|
-
});
|
18583
|
-
}
|
18614
|
+
return executeHeaderFns(reqHeaders);
|
18584
18615
|
}
|
18585
18616
|
}
|
18586
18617
|
|
@@ -18723,11 +18754,12 @@ function $HttpProvider() {
|
|
18723
18754
|
* !!! ACCESSES CLOSURE VARS:
|
18724
18755
|
* $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
|
18725
18756
|
*/
|
18726
|
-
function sendReq(config, reqData
|
18757
|
+
function sendReq(config, reqData) {
|
18727
18758
|
var deferred = $q.defer(),
|
18728
18759
|
promise = deferred.promise,
|
18729
18760
|
cache,
|
18730
18761
|
cachedResp,
|
18762
|
+
reqHeaders = config.headers,
|
18731
18763
|
url = buildUrl(config.url, config.params);
|
18732
18764
|
|
18733
18765
|
$http.pendingRequests.push(config);
|
@@ -20427,8 +20459,8 @@ function $LocationProvider() {
|
|
20427
20459
|
* @param {string=} oldState History state object that was before it was changed.
|
20428
20460
|
*/
|
20429
20461
|
|
20430
|
-
this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
|
20431
|
-
function($rootScope, $browser, $sniffer, $rootElement) {
|
20462
|
+
this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',
|
20463
|
+
function($rootScope, $browser, $sniffer, $rootElement, $window) {
|
20432
20464
|
var $location,
|
20433
20465
|
LocationMode,
|
20434
20466
|
baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
|
@@ -20510,7 +20542,7 @@ function $LocationProvider() {
|
|
20510
20542
|
if ($location.absUrl() != $browser.url()) {
|
20511
20543
|
$rootScope.$apply();
|
20512
20544
|
// hack to work around FF6 bug 684208 when scenario runner clicks on links
|
20513
|
-
window.angular['ff-684208-preventDefault'] = true;
|
20545
|
+
$window.angular['ff-684208-preventDefault'] = true;
|
20514
20546
|
}
|
20515
20547
|
}
|
20516
20548
|
}
|
@@ -21126,6 +21158,8 @@ Parser.prototype = {
|
|
21126
21158
|
primary = this.arrayDeclaration();
|
21127
21159
|
} else if (this.expect('{')) {
|
21128
21160
|
primary = this.object();
|
21161
|
+
} else if (this.peek().identifier && this.peek().text in CONSTANTS) {
|
21162
|
+
primary = CONSTANTS[this.consume().text];
|
21129
21163
|
} else if (this.peek().identifier) {
|
21130
21164
|
primary = this.identifier();
|
21131
21165
|
} else if (this.peek().constant) {
|
@@ -21228,7 +21262,7 @@ Parser.prototype = {
|
|
21228
21262
|
id += this.consume().text + this.consume().text;
|
21229
21263
|
}
|
21230
21264
|
|
21231
|
-
return
|
21265
|
+
return getterFn(id, this.options, this.text);
|
21232
21266
|
},
|
21233
21267
|
|
21234
21268
|
constant: function() {
|
@@ -21418,17 +21452,16 @@ Parser.prototype = {
|
|
21418
21452
|
},
|
21419
21453
|
|
21420
21454
|
fieldAccess: function(object) {
|
21421
|
-
var
|
21422
|
-
var field = this.consume().text;
|
21423
|
-
var getter = getterFn(field, this.options, expression);
|
21455
|
+
var getter = this.identifier();
|
21424
21456
|
|
21425
21457
|
return extend(function $parseFieldAccess(scope, locals, self) {
|
21426
|
-
|
21458
|
+
var o = self || object(scope, locals);
|
21459
|
+
return (o == null) ? undefined : getter(o);
|
21427
21460
|
}, {
|
21428
21461
|
assign: function(scope, value, locals) {
|
21429
21462
|
var o = object(scope, locals);
|
21430
21463
|
if (!o) object.assign(scope, o = {});
|
21431
|
-
return
|
21464
|
+
return getter.assign(o, value);
|
21432
21465
|
}
|
21433
21466
|
});
|
21434
21467
|
},
|
@@ -22586,12 +22619,10 @@ function qFactory(nextTick, exceptionHandler) {
|
|
22586
22619
|
function $$RAFProvider() { //rAF
|
22587
22620
|
this.$get = ['$window', '$timeout', function($window, $timeout) {
|
22588
22621
|
var requestAnimationFrame = $window.requestAnimationFrame ||
|
22589
|
-
$window.webkitRequestAnimationFrame
|
22590
|
-
$window.mozRequestAnimationFrame;
|
22622
|
+
$window.webkitRequestAnimationFrame;
|
22591
22623
|
|
22592
22624
|
var cancelAnimationFrame = $window.cancelAnimationFrame ||
|
22593
22625
|
$window.webkitCancelAnimationFrame ||
|
22594
|
-
$window.mozCancelAnimationFrame ||
|
22595
22626
|
$window.webkitCancelRequestAnimationFrame;
|
22596
22627
|
|
22597
22628
|
var rafSupported = !!requestAnimationFrame;
|
@@ -22720,7 +22751,6 @@ function $RootScopeProvider() {
|
|
22720
22751
|
var child = parent.$new();
|
22721
22752
|
|
22722
22753
|
parent.salutation = "Hello";
|
22723
|
-
child.name = "World";
|
22724
22754
|
expect(child.salutation).toEqual('Hello');
|
22725
22755
|
|
22726
22756
|
child.salutation = "Welcome";
|
@@ -23358,7 +23388,7 @@ function $RootScopeProvider() {
|
|
23358
23388
|
while (asyncQueue.length) {
|
23359
23389
|
try {
|
23360
23390
|
asyncTask = asyncQueue.shift();
|
23361
|
-
asyncTask.scope.$eval(asyncTask.expression);
|
23391
|
+
asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
|
23362
23392
|
} catch (e) {
|
23363
23393
|
$exceptionHandler(e);
|
23364
23394
|
}
|
@@ -23573,8 +23603,9 @@ function $RootScopeProvider() {
|
|
23573
23603
|
* - `string`: execute using the rules as defined in {@link guide/expression expression}.
|
23574
23604
|
* - `function(scope)`: execute the function with the current `scope` parameter.
|
23575
23605
|
*
|
23606
|
+
* @param {(object)=} locals Local variables object, useful for overriding values in scope.
|
23576
23607
|
*/
|
23577
|
-
$evalAsync: function(expr) {
|
23608
|
+
$evalAsync: function(expr, locals) {
|
23578
23609
|
// if we are outside of an $digest loop and this is the first time we are scheduling async
|
23579
23610
|
// task also schedule async auto-flush
|
23580
23611
|
if (!$rootScope.$$phase && !asyncQueue.length) {
|
@@ -23585,7 +23616,7 @@ function $RootScopeProvider() {
|
|
23585
23616
|
});
|
23586
23617
|
}
|
23587
23618
|
|
23588
|
-
asyncQueue.push({scope: this, expression: expr});
|
23619
|
+
asyncQueue.push({scope: this, expression: expr, locals: locals});
|
23589
23620
|
},
|
23590
23621
|
|
23591
23622
|
$$postDigest: function(fn) {
|
@@ -25157,7 +25188,7 @@ var $compileMinErr = minErr('$compile');
|
|
25157
25188
|
* @description
|
25158
25189
|
* The `$templateRequest` service downloads the provided template using `$http` and, upon success,
|
25159
25190
|
* stores the contents inside of `$templateCache`. If the HTTP request fails or the response data
|
25160
|
-
* of the HTTP request is empty
|
25191
|
+
* of the HTTP request is empty, a `$compile` error will be thrown (the exception can be thwarted
|
25161
25192
|
* by setting the 2nd parameter of the function to true).
|
25162
25193
|
*
|
25163
25194
|
* @param {string} tpl The HTTP request template URL
|
@@ -25717,19 +25748,26 @@ function $FilterProvider($provide) {
|
|
25717
25748
|
*
|
25718
25749
|
* Can be one of:
|
25719
25750
|
*
|
25720
|
-
* - `string`: The string is
|
25721
|
-
*
|
25722
|
-
*
|
25751
|
+
* - `string`: The string is used for matching against the contents of the `array`. All strings or
|
25752
|
+
* objects with string properties in `array` that match this string will be returned. This also
|
25753
|
+
* applies to nested object properties.
|
25754
|
+
* The predicate can be negated by prefixing the string with `!`.
|
25723
25755
|
*
|
25724
25756
|
* - `Object`: A pattern object can be used to filter specific properties on objects contained
|
25725
25757
|
* by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
|
25726
25758
|
* which have property `name` containing "M" and property `phone` containing "1". A special
|
25727
25759
|
* property name `$` can be used (as in `{$:"text"}`) to accept a match against any
|
25728
|
-
* property of the object. That's equivalent to the simple
|
25729
|
-
* as described above. The predicate can be negated by prefixing
|
25730
|
-
*
|
25760
|
+
* property of the object or its nested object properties. That's equivalent to the simple
|
25761
|
+
* substring match with a `string` as described above. The predicate can be negated by prefixing
|
25762
|
+
* the string with `!`.
|
25763
|
+
* For example `{name: "!M"}` predicate will return an array of items which have property `name`
|
25731
25764
|
* not containing "M".
|
25732
25765
|
*
|
25766
|
+
* Note that a named property will match properties on the same level only, while the special
|
25767
|
+
* `$` property will match properties on the same level or deeper. E.g. an array item like
|
25768
|
+
* `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but
|
25769
|
+
* **will** be matched by `{$: 'John'}`.
|
25770
|
+
*
|
25733
25771
|
* - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
|
25734
25772
|
* function is called for each element of `array`. The final result is an array of those
|
25735
25773
|
* elements that the predicate returned true for.
|
@@ -25742,10 +25780,10 @@ function $FilterProvider($provide) {
|
|
25742
25780
|
*
|
25743
25781
|
* - `function(actual, expected)`:
|
25744
25782
|
* The function will be given the object value and the predicate value to compare and
|
25745
|
-
* should return true if
|
25783
|
+
* should return true if both values should be considered equal.
|
25746
25784
|
*
|
25747
|
-
* - `true`: A shorthand for `function(actual, expected) { return angular.equals(
|
25748
|
-
*
|
25785
|
+
* - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.
|
25786
|
+
* This is essentially strict comparison of expected and actual.
|
25749
25787
|
*
|
25750
25788
|
* - `false|undefined`: A short hand for a function which will look for a substring match in case
|
25751
25789
|
* insensitive way.
|
@@ -25848,6 +25886,7 @@ function filterFilter() {
|
|
25848
25886
|
|
25849
25887
|
// Helper functions for `filterFilter`
|
25850
25888
|
function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
25889
|
+
var shouldMatchPrimitives = isObject(expression) && ('$' in expression);
|
25851
25890
|
var predicateFn;
|
25852
25891
|
|
25853
25892
|
if (comparator === true) {
|
@@ -25866,13 +25905,16 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
|
25866
25905
|
}
|
25867
25906
|
|
25868
25907
|
predicateFn = function(item) {
|
25908
|
+
if (shouldMatchPrimitives && !isObject(item)) {
|
25909
|
+
return deepCompare(item, expression.$, comparator, false);
|
25910
|
+
}
|
25869
25911
|
return deepCompare(item, expression, comparator, matchAgainstAnyProp);
|
25870
25912
|
};
|
25871
25913
|
|
25872
25914
|
return predicateFn;
|
25873
25915
|
}
|
25874
25916
|
|
25875
|
-
function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
25917
|
+
function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) {
|
25876
25918
|
var actualType = typeof actual;
|
25877
25919
|
var expectedType = typeof expected;
|
25878
25920
|
|
@@ -25891,11 +25933,11 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
|
25891
25933
|
var key;
|
25892
25934
|
if (matchAgainstAnyProp) {
|
25893
25935
|
for (key in actual) {
|
25894
|
-
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator)) {
|
25936
|
+
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) {
|
25895
25937
|
return true;
|
25896
25938
|
}
|
25897
25939
|
}
|
25898
|
-
return false;
|
25940
|
+
return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false);
|
25899
25941
|
} else if (expectedType === 'object') {
|
25900
25942
|
for (key in expected) {
|
25901
25943
|
var expectedVal = expected[key];
|
@@ -25903,9 +25945,9 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
|
25903
25945
|
continue;
|
25904
25946
|
}
|
25905
25947
|
|
25906
|
-
var
|
25907
|
-
var actualVal =
|
25908
|
-
if (!deepCompare(actualVal, expectedVal, comparator,
|
25948
|
+
var matchAnyProperty = key === '$';
|
25949
|
+
var actualVal = matchAnyProperty ? actual : actual[key];
|
25950
|
+
if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) {
|
25909
25951
|
return false;
|
25910
25952
|
}
|
25911
25953
|
}
|
@@ -26277,8 +26319,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d
|
|
26277
26319
|
* * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
|
26278
26320
|
* * `'a'`: AM/PM marker
|
26279
26321
|
* * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
|
26280
|
-
* * `'ww'`:
|
26281
|
-
* * `'w'`:
|
26322
|
+
* * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year
|
26323
|
+
* * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year
|
26282
26324
|
*
|
26283
26325
|
* `format` string can also be one of the following predefined
|
26284
26326
|
* {@link guide/i18n localizable formats}:
|
@@ -26578,8 +26620,7 @@ function limitToFilter() {
|
|
26578
26620
|
}
|
26579
26621
|
}
|
26580
26622
|
|
26581
|
-
var
|
26582
|
-
i, n;
|
26623
|
+
var i, n;
|
26583
26624
|
|
26584
26625
|
// if abs(limit) exceeds maximum length, trim it
|
26585
26626
|
if (limit > input.length)
|
@@ -26591,15 +26632,14 @@ function limitToFilter() {
|
|
26591
26632
|
i = 0;
|
26592
26633
|
n = limit;
|
26593
26634
|
} else {
|
26635
|
+
// zero and NaN check on limit - return empty array
|
26636
|
+
if (!limit) return [];
|
26637
|
+
|
26594
26638
|
i = input.length + limit;
|
26595
26639
|
n = input.length;
|
26596
26640
|
}
|
26597
26641
|
|
26598
|
-
|
26599
|
-
out.push(input[i]);
|
26600
|
-
}
|
26601
|
-
|
26602
|
-
return out;
|
26642
|
+
return input.slice(i, n);
|
26603
26643
|
};
|
26604
26644
|
}
|
26605
26645
|
|
@@ -26733,9 +26773,7 @@ function orderByFilter($parse) {
|
|
26733
26773
|
}
|
26734
26774
|
if (predicate === '') {
|
26735
26775
|
// Effectively no predicate was passed so we compare identity
|
26736
|
-
return reverseComparator(
|
26737
|
-
return compare(a, b);
|
26738
|
-
}, descending);
|
26776
|
+
return reverseComparator(compare, descending);
|
26739
26777
|
}
|
26740
26778
|
get = $parse(predicate);
|
26741
26779
|
if (get.constant) {
|
@@ -26763,29 +26801,37 @@ function orderByFilter($parse) {
|
|
26763
26801
|
? function(a, b) {return comp(b,a);}
|
26764
26802
|
: comp;
|
26765
26803
|
}
|
26804
|
+
|
26805
|
+
function isPrimitive(value) {
|
26806
|
+
switch (typeof value) {
|
26807
|
+
case 'number': /* falls through */
|
26808
|
+
case 'boolean': /* falls through */
|
26809
|
+
case 'string':
|
26810
|
+
return true;
|
26811
|
+
default:
|
26812
|
+
return false;
|
26813
|
+
}
|
26814
|
+
}
|
26815
|
+
|
26816
|
+
function objectToString(value) {
|
26817
|
+
if (value === null) return 'null';
|
26818
|
+
if (typeof value.valueOf === 'function') {
|
26819
|
+
value = value.valueOf();
|
26820
|
+
if (isPrimitive(value)) return value;
|
26821
|
+
}
|
26822
|
+
if (typeof value.toString === 'function') {
|
26823
|
+
value = value.toString();
|
26824
|
+
if (isPrimitive(value)) return value;
|
26825
|
+
}
|
26826
|
+
return '';
|
26827
|
+
}
|
26828
|
+
|
26766
26829
|
function compare(v1, v2) {
|
26767
26830
|
var t1 = typeof v1;
|
26768
26831
|
var t2 = typeof v2;
|
26769
|
-
// Prepare values for Abstract Relational Comparison
|
26770
|
-
// (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5):
|
26771
|
-
// If the resulting values are identical, return 0 to prevent
|
26772
|
-
// incorrect re-ordering.
|
26773
26832
|
if (t1 === t2 && t1 === "object") {
|
26774
|
-
|
26775
|
-
|
26776
|
-
t1 = typeof (v1.valueOf ? v1 = v1.valueOf() : v1);
|
26777
|
-
t2 = typeof (v2.valueOf ? v2 = v2.valueOf() : v2);
|
26778
|
-
if (t1 === t2 && t1 === "object") {
|
26779
|
-
// Object.prototype.valueOf will return the original object, by
|
26780
|
-
// default. If we do not receive a primitive value, use ToString()
|
26781
|
-
// instead.
|
26782
|
-
t1 = typeof (v1.toString ? v1 = v1.toString() : v1);
|
26783
|
-
t2 = typeof (v2.toString ? v2 = v2.toString() : v2);
|
26784
|
-
|
26785
|
-
// If the end result of toString() for each item is the same, do not
|
26786
|
-
// perform relational comparison, and do not re-order objects.
|
26787
|
-
if (t1 === t2 && v1 === v2 || t1 === "object") return 0;
|
26788
|
-
}
|
26833
|
+
v1 = objectToString(v1);
|
26834
|
+
v2 = objectToString(v2);
|
26789
26835
|
}
|
26790
26836
|
if (t1 === t2) {
|
26791
26837
|
if (t1 === "string") {
|
@@ -33519,7 +33565,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
33519
33565
|
var aliasAs = match[3];
|
33520
33566
|
var trackByExp = match[4];
|
33521
33567
|
|
33522
|
-
match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
|
33568
|
+
match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);
|
33523
33569
|
|
33524
33570
|
if (!match) {
|
33525
33571
|
throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",
|
@@ -34428,14 +34474,15 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34428
34474
|
*
|
34429
34475
|
* The `ngOptions` attribute can be used to dynamically generate a list of `<option>`
|
34430
34476
|
* elements for the `<select>` element using the array or object obtained by evaluating the
|
34431
|
-
* `ngOptions`
|
34477
|
+
* `ngOptions` comprehension expression.
|
34432
34478
|
*
|
34433
34479
|
* In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
|
34434
|
-
* similar result. However,
|
34480
|
+
* similar result. However, `ngOptions` provides some benefits such as reducing memory and
|
34435
34481
|
* increasing speed by not creating a new scope for each repeated instance, as well as providing
|
34436
|
-
* more flexibility in how the
|
34437
|
-
* used when the
|
34438
|
-
* element can only be bound to string values at
|
34482
|
+
* more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
|
34483
|
+
* comprehension expression. `ngOptions` should be used when the `<select>` model needs to be bound
|
34484
|
+
* to a non-string value. This is because an option element can only be bound to string values at
|
34485
|
+
* present.
|
34439
34486
|
*
|
34440
34487
|
* When an item in the `<select>` menu is selected, the array element or object property
|
34441
34488
|
* represented by the selected option will be bound to the model identified by the `ngModel`
|
@@ -34450,28 +34497,51 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34450
34497
|
* array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).
|
34451
34498
|
* </div>
|
34452
34499
|
*
|
34453
|
-
* ## `select as
|
34500
|
+
* ## `select` **`as`**
|
34454
34501
|
*
|
34455
|
-
* Using `select as
|
34502
|
+
* Using `select` **`as`** will bind the result of the `select` expression to the model, but
|
34456
34503
|
* the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)
|
34457
|
-
* or property name (for object data sources) of the value within the collection. If a
|
34504
|
+
* or property name (for object data sources) of the value within the collection. If a **`track by`** expression
|
34458
34505
|
* is used, the result of that expression will be set as the value of the `option` and `select` elements.
|
34459
34506
|
*
|
34460
|
-
*
|
34461
|
-
*
|
34462
|
-
*
|
34463
|
-
*
|
34464
|
-
*
|
34465
|
-
*
|
34466
|
-
*
|
34467
|
-
*
|
34468
|
-
*
|
34469
|
-
*
|
34470
|
-
*
|
34471
|
-
*
|
34472
|
-
*
|
34473
|
-
*
|
34474
|
-
*
|
34507
|
+
*
|
34508
|
+
* ### `select` **`as`** and **`track by`**
|
34509
|
+
*
|
34510
|
+
* <div class="alert alert-warning">
|
34511
|
+
* Do not use `select` **`as`** and **`track by`** in the same expression. They are not designed to work together.
|
34512
|
+
* </div>
|
34513
|
+
*
|
34514
|
+
* Consider the following example:
|
34515
|
+
*
|
34516
|
+
* ```html
|
34517
|
+
* <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
|
34518
|
+
* ```
|
34519
|
+
*
|
34520
|
+
* ```js
|
34521
|
+
* $scope.values = [{
|
34522
|
+
* id: 1,
|
34523
|
+
* label: 'aLabel',
|
34524
|
+
* subItem: { name: 'aSubItem' }
|
34525
|
+
* }, {
|
34526
|
+
* id: 2,
|
34527
|
+
* label: 'bLabel',
|
34528
|
+
* subItem: { name: 'bSubItem' }
|
34529
|
+
* }];
|
34530
|
+
*
|
34531
|
+
* $scope.selected = { name: 'aSubItem' };
|
34532
|
+
* ```
|
34533
|
+
*
|
34534
|
+
* With the purpose of preserving the selection, the **`track by`** expression is always applied to the element
|
34535
|
+
* of the data source (to `item` in this example). To calculate whether an element is selected, we do the
|
34536
|
+
* following:
|
34537
|
+
*
|
34538
|
+
* 1. Apply **`track by`** to the elements in the array. In the example: `[1, 2]`
|
34539
|
+
* 2. Apply **`track by`** to the already selected value in `ngModel`.
|
34540
|
+
* In the example: this is not possible as **`track by`** refers to `item.id`, but the selected
|
34541
|
+
* value from `ngModel` is `{name: 'aSubItem'}`, so the **`track by`** expression is applied to
|
34542
|
+
* a wrong object, the selected element can't be found, `<select>` is always reset to the "not
|
34543
|
+
* selected" option.
|
34544
|
+
*
|
34475
34545
|
*
|
34476
34546
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
34477
34547
|
* @param {string=} name Property name of the form under which the control is published.
|