angularjs-rails 1.3.6 → 1.3.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
*/
|
@@ -54,7 +54,7 @@ function minErr(module, ErrorConstructor) {
|
|
54
54
|
return match;
|
55
55
|
});
|
56
56
|
|
57
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
57
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.8/' +
|
58
58
|
(module ? module + '/' : '') + code;
|
59
59
|
for (i = 2; i < arguments.length; i++) {
|
60
60
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -109,6 +109,7 @@ function minErr(module, ErrorConstructor) {
|
|
109
109
|
isWindow: true,
|
110
110
|
isScope: true,
|
111
111
|
isFile: true,
|
112
|
+
isFormData: true,
|
112
113
|
isBlob: true,
|
113
114
|
isBoolean: true,
|
114
115
|
isPromiseLike: true,
|
@@ -464,6 +465,8 @@ noop.$inject = [];
|
|
464
465
|
return (transformationFn || angular.identity)(value);
|
465
466
|
};
|
466
467
|
```
|
468
|
+
* @param {*} value to be returned.
|
469
|
+
* @returns {*} the value passed in.
|
467
470
|
*/
|
468
471
|
function identity($) {return $;}
|
469
472
|
identity.$inject = [];
|
@@ -630,6 +633,11 @@ function isFile(obj) {
|
|
630
633
|
}
|
631
634
|
|
632
635
|
|
636
|
+
function isFormData(obj) {
|
637
|
+
return toString.call(obj) === '[object FormData]';
|
638
|
+
}
|
639
|
+
|
640
|
+
|
633
641
|
function isBlob(obj) {
|
634
642
|
return toString.call(obj) === '[object Blob]';
|
635
643
|
}
|
@@ -713,7 +721,7 @@ function arrayRemove(array, value) {
|
|
713
721
|
* Creates a deep copy of `source`, which should be an object or an array.
|
714
722
|
*
|
715
723
|
* * If no destination is supplied, a copy of the object or array is created.
|
716
|
-
* * If a destination is provided, all of its elements (for
|
724
|
+
* * If a destination is provided, all of its elements (for arrays) or properties (for objects)
|
717
725
|
* are deleted and then all elements/properties from the source are copied to it.
|
718
726
|
* * If `source` is not an object or array (inc. `null` and `undefined`), `source` is returned.
|
719
727
|
* * If `source` is identical to 'destination' an exception will be thrown.
|
@@ -1051,7 +1059,7 @@ function toJson(obj, pretty) {
|
|
1051
1059
|
* Deserializes a JSON string.
|
1052
1060
|
*
|
1053
1061
|
* @param {string} json JSON string to deserialize.
|
1054
|
-
* @returns {Object|Array|string|number} Deserialized
|
1062
|
+
* @returns {Object|Array|string|number} Deserialized JSON string.
|
1055
1063
|
*/
|
1056
1064
|
function fromJson(json) {
|
1057
1065
|
return isString(json)
|
@@ -1224,7 +1232,7 @@ function getNgAttribute(element, ngAttr) {
|
|
1224
1232
|
* {@link angular.bootstrap} instead. AngularJS applications cannot be nested within each other.
|
1225
1233
|
*
|
1226
1234
|
* You can specify an **AngularJS module** to be used as the root module for the application. This
|
1227
|
-
* module will be loaded into the {@link auto.$injector} when the application is bootstrapped
|
1235
|
+
* module will be loaded into the {@link auto.$injector} when the application is bootstrapped. It
|
1228
1236
|
* should contain the application code needed or have dependencies on other modules that will
|
1229
1237
|
* contain the code. See {@link angular.module} for more information.
|
1230
1238
|
*
|
@@ -1232,7 +1240,7 @@ function getNgAttribute(element, ngAttr) {
|
|
1232
1240
|
* document would not be compiled, the `AppController` would not be instantiated and the `{{ a+b }}`
|
1233
1241
|
* would not be resolved to `3`.
|
1234
1242
|
*
|
1235
|
-
* `ngApp` is the easiest, and most common
|
1243
|
+
* `ngApp` is the easiest, and most common way to bootstrap an application.
|
1236
1244
|
*
|
1237
1245
|
<example module="ngAppDemo">
|
1238
1246
|
<file name="index.html">
|
@@ -1492,7 +1500,12 @@ function reloadWithDebugInfo() {
|
|
1492
1500
|
* @param {DOMElement} element DOM element which is the root of angular application.
|
1493
1501
|
*/
|
1494
1502
|
function getTestability(rootElement) {
|
1495
|
-
|
1503
|
+
var injector = angular.element(rootElement).injector();
|
1504
|
+
if (!injector) {
|
1505
|
+
throw ngMinErr('test',
|
1506
|
+
'no injector found for element argument to getTestability');
|
1507
|
+
}
|
1508
|
+
return injector.get('$$testability');
|
1496
1509
|
}
|
1497
1510
|
|
1498
1511
|
var SNAKE_CASE_REGEXP = /[A-Z]/g;
|
@@ -2105,11 +2118,11 @@ function toDebugString(obj) {
|
|
2105
2118
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2106
2119
|
*/
|
2107
2120
|
var version = {
|
2108
|
-
full: '1.3.
|
2121
|
+
full: '1.3.8', // all of these placeholder strings will be replaced by grunt's
|
2109
2122
|
major: 1, // package task
|
2110
2123
|
minor: 3,
|
2111
|
-
dot:
|
2112
|
-
codeName: '
|
2124
|
+
dot: 8,
|
2125
|
+
codeName: 'prophetic-narwhal'
|
2113
2126
|
};
|
2114
2127
|
|
2115
2128
|
|
@@ -7122,7 +7135,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7122
7135
|
// support ngAttr attribute binding
|
7123
7136
|
ngAttrName = directiveNormalize(name);
|
7124
7137
|
if (isNgAttr = NG_ATTR_BINDING.test(ngAttrName)) {
|
7125
|
-
name =
|
7138
|
+
name = name.replace(PREFIX_REGEXP, '')
|
7139
|
+
.substr(8).replace(/_(.)/g, function(match, letter) {
|
7140
|
+
return letter.toUpperCase();
|
7141
|
+
});
|
7126
7142
|
}
|
7127
7143
|
|
7128
7144
|
var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
|
@@ -8034,7 +8050,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8034
8050
|
|
8035
8051
|
|
8036
8052
|
function addAttrInterpolateDirective(node, directives, value, name, allOrNothing) {
|
8037
|
-
var
|
8053
|
+
var trustedContext = getTrustedContext(node, name);
|
8054
|
+
allOrNothing = ALL_OR_NOTHING_ATTRS[name] || allOrNothing;
|
8055
|
+
|
8056
|
+
var interpolateFn = $interpolate(value, true, trustedContext, allOrNothing);
|
8038
8057
|
|
8039
8058
|
// no interpolation found -> ignore
|
8040
8059
|
if (!interpolateFn) return;
|
@@ -8059,16 +8078,16 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8059
8078
|
"ng- versions (such as ng-click instead of onclick) instead.");
|
8060
8079
|
}
|
8061
8080
|
|
8062
|
-
// If the attribute
|
8063
|
-
|
8064
|
-
|
8081
|
+
// If the attribute has changed since last $interpolate()ed
|
8082
|
+
var newValue = attr[name];
|
8083
|
+
if (newValue !== value) {
|
8084
|
+
// we need to interpolate again since the attribute value has been updated
|
8085
|
+
// (e.g. by another directive's compile function)
|
8086
|
+
// ensure unset/empty values make interpolateFn falsy
|
8087
|
+
interpolateFn = newValue && $interpolate(newValue, true, trustedContext, allOrNothing);
|
8088
|
+
value = newValue;
|
8065
8089
|
}
|
8066
8090
|
|
8067
|
-
// we need to interpolate again, in case the attribute value has been updated
|
8068
|
-
// (e.g. by another directive's compile function)
|
8069
|
-
interpolateFn = $interpolate(attr[name], true, getTrustedContext(node, name),
|
8070
|
-
ALL_OR_NOTHING_ATTRS[name] || allOrNothing);
|
8071
|
-
|
8072
8091
|
// if attribute was updated so that there is no interpolation going on we don't want to
|
8073
8092
|
// register any observers
|
8074
8093
|
if (!interpolateFn) return;
|
@@ -8529,23 +8548,34 @@ function $ExceptionHandlerProvider() {
|
|
8529
8548
|
|
8530
8549
|
var APPLICATION_JSON = 'application/json';
|
8531
8550
|
var CONTENT_TYPE_APPLICATION_JSON = {'Content-Type': APPLICATION_JSON + ';charset=utf-8'};
|
8532
|
-
var JSON_START = /^\
|
8533
|
-
var
|
8551
|
+
var JSON_START = /^\[|^\{(?!\{)/;
|
8552
|
+
var JSON_ENDS = {
|
8553
|
+
'[': /]$/,
|
8554
|
+
'{': /}$/
|
8555
|
+
};
|
8534
8556
|
var JSON_PROTECTION_PREFIX = /^\)\]\}',?\n/;
|
8535
8557
|
|
8536
8558
|
function defaultHttpResponseTransform(data, headers) {
|
8537
8559
|
if (isString(data)) {
|
8538
|
-
//
|
8539
|
-
|
8540
|
-
|
8541
|
-
if (
|
8542
|
-
|
8543
|
-
|
8560
|
+
// Strip json vulnerability protection prefix and trim whitespace
|
8561
|
+
var tempData = data.replace(JSON_PROTECTION_PREFIX, '').trim();
|
8562
|
+
|
8563
|
+
if (tempData) {
|
8564
|
+
var contentType = headers('Content-Type');
|
8565
|
+
if ((contentType && (contentType.indexOf(APPLICATION_JSON) === 0)) || isJsonLike(tempData)) {
|
8566
|
+
data = fromJson(tempData);
|
8567
|
+
}
|
8544
8568
|
}
|
8545
8569
|
}
|
8570
|
+
|
8546
8571
|
return data;
|
8547
8572
|
}
|
8548
8573
|
|
8574
|
+
function isJsonLike(str) {
|
8575
|
+
var jsonStart = str.match(JSON_START);
|
8576
|
+
return jsonStart && JSON_ENDS[jsonStart[0]].test(str);
|
8577
|
+
}
|
8578
|
+
|
8549
8579
|
/**
|
8550
8580
|
* Parse headers into key value object
|
8551
8581
|
*
|
@@ -8608,16 +8638,17 @@ function headersGetter(headers) {
|
|
8608
8638
|
* This function is used for both request and response transforming
|
8609
8639
|
*
|
8610
8640
|
* @param {*} data Data to transform.
|
8611
|
-
* @param {function(string=)} headers
|
8641
|
+
* @param {function(string=)} headers HTTP headers getter fn.
|
8642
|
+
* @param {number} status HTTP status code of the response.
|
8612
8643
|
* @param {(Function|Array.<Function>)} fns Function or an array of functions.
|
8613
8644
|
* @returns {*} Transformed data.
|
8614
8645
|
*/
|
8615
|
-
function transformData(data, headers, fns) {
|
8646
|
+
function transformData(data, headers, status, fns) {
|
8616
8647
|
if (isFunction(fns))
|
8617
|
-
return fns(data, headers);
|
8648
|
+
return fns(data, headers, status);
|
8618
8649
|
|
8619
8650
|
forEach(fns, function(fn) {
|
8620
|
-
data = fn(data, headers);
|
8651
|
+
data = fn(data, headers, status);
|
8621
8652
|
});
|
8622
8653
|
|
8623
8654
|
return data;
|
@@ -8669,7 +8700,7 @@ function $HttpProvider() {
|
|
8669
8700
|
|
8670
8701
|
// transform outgoing request data
|
8671
8702
|
transformRequest: [function(d) {
|
8672
|
-
return isObject(d) && !isFile(d) && !isBlob(d) ? toJson(d) : d;
|
8703
|
+
return isObject(d) && !isFile(d) && !isBlob(d) && !isFormData(d) ? toJson(d) : d;
|
8673
8704
|
}],
|
8674
8705
|
|
8675
8706
|
// default headers
|
@@ -8896,7 +8927,7 @@ function $HttpProvider() {
|
|
8896
8927
|
*
|
8897
8928
|
* Both requests and responses can be transformed using transformation functions: `transformRequest`
|
8898
8929
|
* and `transformResponse`. These properties can be a single function that returns
|
8899
|
-
* the transformed value (`{function(data, headersGetter)`) or an array of such transformation functions,
|
8930
|
+
* the transformed value (`{function(data, headersGetter, status)`) or an array of such transformation functions,
|
8900
8931
|
* which allows you to `push` or `unshift` a new transformation function into the transformation chain.
|
8901
8932
|
*
|
8902
8933
|
* ### Default Transformations
|
@@ -9140,9 +9171,9 @@ function $HttpProvider() {
|
|
9140
9171
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
9141
9172
|
* Overriding the Default Transformations}
|
9142
9173
|
* - **transformResponse** –
|
9143
|
-
* `{function(data, headersGetter)|Array.<function(data, headersGetter)>}` –
|
9174
|
+
* `{function(data, headersGetter, status)|Array.<function(data, headersGetter, status)>}` –
|
9144
9175
|
* transform function or an array of such functions. The transform function takes the http
|
9145
|
-
* response body and
|
9176
|
+
* response body, headers and status and returns its transformed (typically deserialized) version.
|
9146
9177
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
9147
9178
|
* Overriding the Default Transformations}
|
9148
9179
|
* - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
|
@@ -9265,24 +9296,23 @@ function $HttpProvider() {
|
|
9265
9296
|
</example>
|
9266
9297
|
*/
|
9267
9298
|
function $http(requestConfig) {
|
9268
|
-
var config = {
|
9269
|
-
method: 'get',
|
9270
|
-
transformRequest: defaults.transformRequest,
|
9271
|
-
transformResponse: defaults.transformResponse
|
9272
|
-
};
|
9273
|
-
var headers = mergeHeaders(requestConfig);
|
9274
9299
|
|
9275
9300
|
if (!angular.isObject(requestConfig)) {
|
9276
9301
|
throw minErr('$http')('badreq', 'Http request configuration must be an object. Received: {0}', requestConfig);
|
9277
9302
|
}
|
9278
9303
|
|
9279
|
-
extend(
|
9280
|
-
|
9304
|
+
var config = extend({
|
9305
|
+
method: 'get',
|
9306
|
+
transformRequest: defaults.transformRequest,
|
9307
|
+
transformResponse: defaults.transformResponse
|
9308
|
+
}, requestConfig);
|
9309
|
+
|
9310
|
+
config.headers = mergeHeaders(requestConfig);
|
9281
9311
|
config.method = uppercase(config.method);
|
9282
9312
|
|
9283
9313
|
var serverRequest = function(config) {
|
9284
|
-
headers = config.headers;
|
9285
|
-
var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
|
9314
|
+
var headers = config.headers;
|
9315
|
+
var reqData = transformData(config.data, headersGetter(headers), undefined, config.transformRequest);
|
9286
9316
|
|
9287
9317
|
// strip content-type if data is undefined
|
9288
9318
|
if (isUndefined(reqData)) {
|
@@ -9298,7 +9328,7 @@ function $HttpProvider() {
|
|
9298
9328
|
}
|
9299
9329
|
|
9300
9330
|
// send request
|
9301
|
-
return sendReq(config, reqData
|
9331
|
+
return sendReq(config, reqData).then(transformResponse, transformResponse);
|
9302
9332
|
};
|
9303
9333
|
|
9304
9334
|
var chain = [serverRequest, undefined];
|
@@ -9343,13 +9373,30 @@ function $HttpProvider() {
|
|
9343
9373
|
if (!response.data) {
|
9344
9374
|
resp.data = response.data;
|
9345
9375
|
} else {
|
9346
|
-
resp.data = transformData(response.data, response.headers, config.transformResponse);
|
9376
|
+
resp.data = transformData(response.data, response.headers, response.status, config.transformResponse);
|
9347
9377
|
}
|
9348
9378
|
return (isSuccess(response.status))
|
9349
9379
|
? resp
|
9350
9380
|
: $q.reject(resp);
|
9351
9381
|
}
|
9352
9382
|
|
9383
|
+
function executeHeaderFns(headers) {
|
9384
|
+
var headerContent, processedHeaders = {};
|
9385
|
+
|
9386
|
+
forEach(headers, function(headerFn, header) {
|
9387
|
+
if (isFunction(headerFn)) {
|
9388
|
+
headerContent = headerFn();
|
9389
|
+
if (headerContent != null) {
|
9390
|
+
processedHeaders[header] = headerContent;
|
9391
|
+
}
|
9392
|
+
} else {
|
9393
|
+
processedHeaders[header] = headerFn;
|
9394
|
+
}
|
9395
|
+
});
|
9396
|
+
|
9397
|
+
return processedHeaders;
|
9398
|
+
}
|
9399
|
+
|
9353
9400
|
function mergeHeaders(config) {
|
9354
9401
|
var defHeaders = defaults.headers,
|
9355
9402
|
reqHeaders = extend({}, config.headers),
|
@@ -9372,23 +9419,7 @@ function $HttpProvider() {
|
|
9372
9419
|
}
|
9373
9420
|
|
9374
9421
|
// execute if header value is a function for merged headers
|
9375
|
-
|
9376
|
-
return reqHeaders;
|
9377
|
-
|
9378
|
-
function execHeaders(headers) {
|
9379
|
-
var headerContent;
|
9380
|
-
|
9381
|
-
forEach(headers, function(headerFn, header) {
|
9382
|
-
if (isFunction(headerFn)) {
|
9383
|
-
headerContent = headerFn();
|
9384
|
-
if (headerContent != null) {
|
9385
|
-
headers[header] = headerContent;
|
9386
|
-
} else {
|
9387
|
-
delete headers[header];
|
9388
|
-
}
|
9389
|
-
}
|
9390
|
-
});
|
9391
|
-
}
|
9422
|
+
return executeHeaderFns(reqHeaders);
|
9392
9423
|
}
|
9393
9424
|
}
|
9394
9425
|
|
@@ -9531,11 +9562,12 @@ function $HttpProvider() {
|
|
9531
9562
|
* !!! ACCESSES CLOSURE VARS:
|
9532
9563
|
* $httpBackend, defaults, $log, $rootScope, defaultCache, $http.pendingRequests
|
9533
9564
|
*/
|
9534
|
-
function sendReq(config, reqData
|
9565
|
+
function sendReq(config, reqData) {
|
9535
9566
|
var deferred = $q.defer(),
|
9536
9567
|
promise = deferred.promise,
|
9537
9568
|
cache,
|
9538
9569
|
cachedResp,
|
9570
|
+
reqHeaders = config.headers,
|
9539
9571
|
url = buildUrl(config.url, config.params);
|
9540
9572
|
|
9541
9573
|
$http.pendingRequests.push(config);
|
@@ -11235,8 +11267,8 @@ function $LocationProvider() {
|
|
11235
11267
|
* @param {string=} oldState History state object that was before it was changed.
|
11236
11268
|
*/
|
11237
11269
|
|
11238
|
-
this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement',
|
11239
|
-
function($rootScope, $browser, $sniffer, $rootElement) {
|
11270
|
+
this.$get = ['$rootScope', '$browser', '$sniffer', '$rootElement', '$window',
|
11271
|
+
function($rootScope, $browser, $sniffer, $rootElement, $window) {
|
11240
11272
|
var $location,
|
11241
11273
|
LocationMode,
|
11242
11274
|
baseHref = $browser.baseHref(), // if base[href] is undefined, it defaults to ''
|
@@ -11318,7 +11350,7 @@ function $LocationProvider() {
|
|
11318
11350
|
if ($location.absUrl() != $browser.url()) {
|
11319
11351
|
$rootScope.$apply();
|
11320
11352
|
// hack to work around FF6 bug 684208 when scenario runner clicks on links
|
11321
|
-
window.angular['ff-684208-preventDefault'] = true;
|
11353
|
+
$window.angular['ff-684208-preventDefault'] = true;
|
11322
11354
|
}
|
11323
11355
|
}
|
11324
11356
|
}
|
@@ -11934,6 +11966,8 @@ Parser.prototype = {
|
|
11934
11966
|
primary = this.arrayDeclaration();
|
11935
11967
|
} else if (this.expect('{')) {
|
11936
11968
|
primary = this.object();
|
11969
|
+
} else if (this.peek().identifier && this.peek().text in CONSTANTS) {
|
11970
|
+
primary = CONSTANTS[this.consume().text];
|
11937
11971
|
} else if (this.peek().identifier) {
|
11938
11972
|
primary = this.identifier();
|
11939
11973
|
} else if (this.peek().constant) {
|
@@ -12036,7 +12070,7 @@ Parser.prototype = {
|
|
12036
12070
|
id += this.consume().text + this.consume().text;
|
12037
12071
|
}
|
12038
12072
|
|
12039
|
-
return
|
12073
|
+
return getterFn(id, this.options, this.text);
|
12040
12074
|
},
|
12041
12075
|
|
12042
12076
|
constant: function() {
|
@@ -12226,17 +12260,16 @@ Parser.prototype = {
|
|
12226
12260
|
},
|
12227
12261
|
|
12228
12262
|
fieldAccess: function(object) {
|
12229
|
-
var
|
12230
|
-
var field = this.consume().text;
|
12231
|
-
var getter = getterFn(field, this.options, expression);
|
12263
|
+
var getter = this.identifier();
|
12232
12264
|
|
12233
12265
|
return extend(function $parseFieldAccess(scope, locals, self) {
|
12234
|
-
|
12266
|
+
var o = self || object(scope, locals);
|
12267
|
+
return (o == null) ? undefined : getter(o);
|
12235
12268
|
}, {
|
12236
12269
|
assign: function(scope, value, locals) {
|
12237
12270
|
var o = object(scope, locals);
|
12238
12271
|
if (!o) object.assign(scope, o = {});
|
12239
|
-
return
|
12272
|
+
return getter.assign(o, value);
|
12240
12273
|
}
|
12241
12274
|
});
|
12242
12275
|
},
|
@@ -13394,12 +13427,10 @@ function qFactory(nextTick, exceptionHandler) {
|
|
13394
13427
|
function $$RAFProvider() { //rAF
|
13395
13428
|
this.$get = ['$window', '$timeout', function($window, $timeout) {
|
13396
13429
|
var requestAnimationFrame = $window.requestAnimationFrame ||
|
13397
|
-
$window.webkitRequestAnimationFrame
|
13398
|
-
$window.mozRequestAnimationFrame;
|
13430
|
+
$window.webkitRequestAnimationFrame;
|
13399
13431
|
|
13400
13432
|
var cancelAnimationFrame = $window.cancelAnimationFrame ||
|
13401
13433
|
$window.webkitCancelAnimationFrame ||
|
13402
|
-
$window.mozCancelAnimationFrame ||
|
13403
13434
|
$window.webkitCancelRequestAnimationFrame;
|
13404
13435
|
|
13405
13436
|
var rafSupported = !!requestAnimationFrame;
|
@@ -13528,7 +13559,6 @@ function $RootScopeProvider() {
|
|
13528
13559
|
var child = parent.$new();
|
13529
13560
|
|
13530
13561
|
parent.salutation = "Hello";
|
13531
|
-
child.name = "World";
|
13532
13562
|
expect(child.salutation).toEqual('Hello');
|
13533
13563
|
|
13534
13564
|
child.salutation = "Welcome";
|
@@ -14166,7 +14196,7 @@ function $RootScopeProvider() {
|
|
14166
14196
|
while (asyncQueue.length) {
|
14167
14197
|
try {
|
14168
14198
|
asyncTask = asyncQueue.shift();
|
14169
|
-
asyncTask.scope.$eval(asyncTask.expression);
|
14199
|
+
asyncTask.scope.$eval(asyncTask.expression, asyncTask.locals);
|
14170
14200
|
} catch (e) {
|
14171
14201
|
$exceptionHandler(e);
|
14172
14202
|
}
|
@@ -14381,8 +14411,9 @@ function $RootScopeProvider() {
|
|
14381
14411
|
* - `string`: execute using the rules as defined in {@link guide/expression expression}.
|
14382
14412
|
* - `function(scope)`: execute the function with the current `scope` parameter.
|
14383
14413
|
*
|
14414
|
+
* @param {(object)=} locals Local variables object, useful for overriding values in scope.
|
14384
14415
|
*/
|
14385
|
-
$evalAsync: function(expr) {
|
14416
|
+
$evalAsync: function(expr, locals) {
|
14386
14417
|
// if we are outside of an $digest loop and this is the first time we are scheduling async
|
14387
14418
|
// task also schedule async auto-flush
|
14388
14419
|
if (!$rootScope.$$phase && !asyncQueue.length) {
|
@@ -14393,7 +14424,7 @@ function $RootScopeProvider() {
|
|
14393
14424
|
});
|
14394
14425
|
}
|
14395
14426
|
|
14396
|
-
asyncQueue.push({scope: this, expression: expr});
|
14427
|
+
asyncQueue.push({scope: this, expression: expr, locals: locals});
|
14397
14428
|
},
|
14398
14429
|
|
14399
14430
|
$$postDigest: function(fn) {
|
@@ -15965,7 +15996,7 @@ var $compileMinErr = minErr('$compile');
|
|
15965
15996
|
* @description
|
15966
15997
|
* The `$templateRequest` service downloads the provided template using `$http` and, upon success,
|
15967
15998
|
* stores the contents inside of `$templateCache`. If the HTTP request fails or the response data
|
15968
|
-
* of the HTTP request is empty
|
15999
|
+
* of the HTTP request is empty, a `$compile` error will be thrown (the exception can be thwarted
|
15969
16000
|
* by setting the 2nd parameter of the function to true).
|
15970
16001
|
*
|
15971
16002
|
* @param {string} tpl The HTTP request template URL
|
@@ -16525,19 +16556,26 @@ function $FilterProvider($provide) {
|
|
16525
16556
|
*
|
16526
16557
|
* Can be one of:
|
16527
16558
|
*
|
16528
|
-
* - `string`: The string is
|
16529
|
-
*
|
16530
|
-
*
|
16559
|
+
* - `string`: The string is used for matching against the contents of the `array`. All strings or
|
16560
|
+
* objects with string properties in `array` that match this string will be returned. This also
|
16561
|
+
* applies to nested object properties.
|
16562
|
+
* The predicate can be negated by prefixing the string with `!`.
|
16531
16563
|
*
|
16532
16564
|
* - `Object`: A pattern object can be used to filter specific properties on objects contained
|
16533
16565
|
* by `array`. For example `{name:"M", phone:"1"}` predicate will return an array of items
|
16534
16566
|
* which have property `name` containing "M" and property `phone` containing "1". A special
|
16535
16567
|
* property name `$` can be used (as in `{$:"text"}`) to accept a match against any
|
16536
|
-
* property of the object. That's equivalent to the simple
|
16537
|
-
* as described above. The predicate can be negated by prefixing
|
16538
|
-
*
|
16568
|
+
* property of the object or its nested object properties. That's equivalent to the simple
|
16569
|
+
* substring match with a `string` as described above. The predicate can be negated by prefixing
|
16570
|
+
* the string with `!`.
|
16571
|
+
* For example `{name: "!M"}` predicate will return an array of items which have property `name`
|
16539
16572
|
* not containing "M".
|
16540
16573
|
*
|
16574
|
+
* Note that a named property will match properties on the same level only, while the special
|
16575
|
+
* `$` property will match properties on the same level or deeper. E.g. an array item like
|
16576
|
+
* `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but
|
16577
|
+
* **will** be matched by `{$: 'John'}`.
|
16578
|
+
*
|
16541
16579
|
* - `function(value, index)`: A predicate function can be used to write arbitrary filters. The
|
16542
16580
|
* function is called for each element of `array`. The final result is an array of those
|
16543
16581
|
* elements that the predicate returned true for.
|
@@ -16550,10 +16588,10 @@ function $FilterProvider($provide) {
|
|
16550
16588
|
*
|
16551
16589
|
* - `function(actual, expected)`:
|
16552
16590
|
* The function will be given the object value and the predicate value to compare and
|
16553
|
-
* should return true if
|
16591
|
+
* should return true if both values should be considered equal.
|
16554
16592
|
*
|
16555
|
-
* - `true`: A shorthand for `function(actual, expected) { return angular.equals(
|
16556
|
-
*
|
16593
|
+
* - `true`: A shorthand for `function(actual, expected) { return angular.equals(actual, expected)}`.
|
16594
|
+
* This is essentially strict comparison of expected and actual.
|
16557
16595
|
*
|
16558
16596
|
* - `false|undefined`: A short hand for a function which will look for a substring match in case
|
16559
16597
|
* insensitive way.
|
@@ -16656,6 +16694,7 @@ function filterFilter() {
|
|
16656
16694
|
|
16657
16695
|
// Helper functions for `filterFilter`
|
16658
16696
|
function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
16697
|
+
var shouldMatchPrimitives = isObject(expression) && ('$' in expression);
|
16659
16698
|
var predicateFn;
|
16660
16699
|
|
16661
16700
|
if (comparator === true) {
|
@@ -16674,13 +16713,16 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
|
16674
16713
|
}
|
16675
16714
|
|
16676
16715
|
predicateFn = function(item) {
|
16716
|
+
if (shouldMatchPrimitives && !isObject(item)) {
|
16717
|
+
return deepCompare(item, expression.$, comparator, false);
|
16718
|
+
}
|
16677
16719
|
return deepCompare(item, expression, comparator, matchAgainstAnyProp);
|
16678
16720
|
};
|
16679
16721
|
|
16680
16722
|
return predicateFn;
|
16681
16723
|
}
|
16682
16724
|
|
16683
|
-
function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
16725
|
+
function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) {
|
16684
16726
|
var actualType = typeof actual;
|
16685
16727
|
var expectedType = typeof expected;
|
16686
16728
|
|
@@ -16699,11 +16741,11 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
|
16699
16741
|
var key;
|
16700
16742
|
if (matchAgainstAnyProp) {
|
16701
16743
|
for (key in actual) {
|
16702
|
-
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator)) {
|
16744
|
+
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator, true)) {
|
16703
16745
|
return true;
|
16704
16746
|
}
|
16705
16747
|
}
|
16706
|
-
return false;
|
16748
|
+
return dontMatchWholeObject ? false : deepCompare(actual, expected, comparator, false);
|
16707
16749
|
} else if (expectedType === 'object') {
|
16708
16750
|
for (key in expected) {
|
16709
16751
|
var expectedVal = expected[key];
|
@@ -16711,9 +16753,9 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
|
16711
16753
|
continue;
|
16712
16754
|
}
|
16713
16755
|
|
16714
|
-
var
|
16715
|
-
var actualVal =
|
16716
|
-
if (!deepCompare(actualVal, expectedVal, comparator,
|
16756
|
+
var matchAnyProperty = key === '$';
|
16757
|
+
var actualVal = matchAnyProperty ? actual : actual[key];
|
16758
|
+
if (!deepCompare(actualVal, expectedVal, comparator, matchAnyProperty, matchAnyProperty)) {
|
16717
16759
|
return false;
|
16718
16760
|
}
|
16719
16761
|
}
|
@@ -17085,8 +17127,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d
|
|
17085
17127
|
* * `'.sss' or ',sss'`: Millisecond in second, padded (000-999)
|
17086
17128
|
* * `'a'`: AM/PM marker
|
17087
17129
|
* * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
|
17088
|
-
* * `'ww'`:
|
17089
|
-
* * `'w'`:
|
17130
|
+
* * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year
|
17131
|
+
* * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year
|
17090
17132
|
*
|
17091
17133
|
* `format` string can also be one of the following predefined
|
17092
17134
|
* {@link guide/i18n localizable formats}:
|
@@ -17386,8 +17428,7 @@ function limitToFilter() {
|
|
17386
17428
|
}
|
17387
17429
|
}
|
17388
17430
|
|
17389
|
-
var
|
17390
|
-
i, n;
|
17431
|
+
var i, n;
|
17391
17432
|
|
17392
17433
|
// if abs(limit) exceeds maximum length, trim it
|
17393
17434
|
if (limit > input.length)
|
@@ -17399,15 +17440,14 @@ function limitToFilter() {
|
|
17399
17440
|
i = 0;
|
17400
17441
|
n = limit;
|
17401
17442
|
} else {
|
17443
|
+
// zero and NaN check on limit - return empty array
|
17444
|
+
if (!limit) return [];
|
17445
|
+
|
17402
17446
|
i = input.length + limit;
|
17403
17447
|
n = input.length;
|
17404
17448
|
}
|
17405
17449
|
|
17406
|
-
|
17407
|
-
out.push(input[i]);
|
17408
|
-
}
|
17409
|
-
|
17410
|
-
return out;
|
17450
|
+
return input.slice(i, n);
|
17411
17451
|
};
|
17412
17452
|
}
|
17413
17453
|
|
@@ -17541,9 +17581,7 @@ function orderByFilter($parse) {
|
|
17541
17581
|
}
|
17542
17582
|
if (predicate === '') {
|
17543
17583
|
// Effectively no predicate was passed so we compare identity
|
17544
|
-
return reverseComparator(
|
17545
|
-
return compare(a, b);
|
17546
|
-
}, descending);
|
17584
|
+
return reverseComparator(compare, descending);
|
17547
17585
|
}
|
17548
17586
|
get = $parse(predicate);
|
17549
17587
|
if (get.constant) {
|
@@ -17571,29 +17609,37 @@ function orderByFilter($parse) {
|
|
17571
17609
|
? function(a, b) {return comp(b,a);}
|
17572
17610
|
: comp;
|
17573
17611
|
}
|
17612
|
+
|
17613
|
+
function isPrimitive(value) {
|
17614
|
+
switch (typeof value) {
|
17615
|
+
case 'number': /* falls through */
|
17616
|
+
case 'boolean': /* falls through */
|
17617
|
+
case 'string':
|
17618
|
+
return true;
|
17619
|
+
default:
|
17620
|
+
return false;
|
17621
|
+
}
|
17622
|
+
}
|
17623
|
+
|
17624
|
+
function objectToString(value) {
|
17625
|
+
if (value === null) return 'null';
|
17626
|
+
if (typeof value.valueOf === 'function') {
|
17627
|
+
value = value.valueOf();
|
17628
|
+
if (isPrimitive(value)) return value;
|
17629
|
+
}
|
17630
|
+
if (typeof value.toString === 'function') {
|
17631
|
+
value = value.toString();
|
17632
|
+
if (isPrimitive(value)) return value;
|
17633
|
+
}
|
17634
|
+
return '';
|
17635
|
+
}
|
17636
|
+
|
17574
17637
|
function compare(v1, v2) {
|
17575
17638
|
var t1 = typeof v1;
|
17576
17639
|
var t2 = typeof v2;
|
17577
|
-
// Prepare values for Abstract Relational Comparison
|
17578
|
-
// (http://www.ecma-international.org/ecma-262/5.1/#sec-11.8.5):
|
17579
|
-
// If the resulting values are identical, return 0 to prevent
|
17580
|
-
// incorrect re-ordering.
|
17581
17640
|
if (t1 === t2 && t1 === "object") {
|
17582
|
-
|
17583
|
-
|
17584
|
-
t1 = typeof (v1.valueOf ? v1 = v1.valueOf() : v1);
|
17585
|
-
t2 = typeof (v2.valueOf ? v2 = v2.valueOf() : v2);
|
17586
|
-
if (t1 === t2 && t1 === "object") {
|
17587
|
-
// Object.prototype.valueOf will return the original object, by
|
17588
|
-
// default. If we do not receive a primitive value, use ToString()
|
17589
|
-
// instead.
|
17590
|
-
t1 = typeof (v1.toString ? v1 = v1.toString() : v1);
|
17591
|
-
t2 = typeof (v2.toString ? v2 = v2.toString() : v2);
|
17592
|
-
|
17593
|
-
// If the end result of toString() for each item is the same, do not
|
17594
|
-
// perform relational comparison, and do not re-order objects.
|
17595
|
-
if (t1 === t2 && v1 === v2 || t1 === "object") return 0;
|
17596
|
-
}
|
17641
|
+
v1 = objectToString(v1);
|
17642
|
+
v2 = objectToString(v2);
|
17597
17643
|
}
|
17598
17644
|
if (t1 === t2) {
|
17599
17645
|
if (t1 === "string") {
|
@@ -24327,7 +24373,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
24327
24373
|
var aliasAs = match[3];
|
24328
24374
|
var trackByExp = match[4];
|
24329
24375
|
|
24330
|
-
match = lhs.match(/^(?:([\$\w]+)|\(([\$\w]+)\s*,\s*([\$\w]+)\))$/);
|
24376
|
+
match = lhs.match(/^(?:(\s*[\$\w]+)|\(\s*([\$\w]+)\s*,\s*([\$\w]+)\s*\))$/);
|
24331
24377
|
|
24332
24378
|
if (!match) {
|
24333
24379
|
throw ngRepeatMinErr('iidexp', "'_item_' in '_item_ in _collection_' should be an identifier or '(_key_, _value_)' expression, but got '{0}'.",
|
@@ -25236,14 +25282,15 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
25236
25282
|
*
|
25237
25283
|
* The `ngOptions` attribute can be used to dynamically generate a list of `<option>`
|
25238
25284
|
* elements for the `<select>` element using the array or object obtained by evaluating the
|
25239
|
-
* `ngOptions`
|
25285
|
+
* `ngOptions` comprehension expression.
|
25240
25286
|
*
|
25241
25287
|
* In many cases, `ngRepeat` can be used on `<option>` elements instead of `ngOptions` to achieve a
|
25242
|
-
* similar result. However,
|
25288
|
+
* similar result. However, `ngOptions` provides some benefits such as reducing memory and
|
25243
25289
|
* increasing speed by not creating a new scope for each repeated instance, as well as providing
|
25244
|
-
* more flexibility in how the
|
25245
|
-
* used when the
|
25246
|
-
* element can only be bound to string values at
|
25290
|
+
* more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
|
25291
|
+
* comprehension expression. `ngOptions` should be used when the `<select>` model needs to be bound
|
25292
|
+
* to a non-string value. This is because an option element can only be bound to string values at
|
25293
|
+
* present.
|
25247
25294
|
*
|
25248
25295
|
* When an item in the `<select>` menu is selected, the array element or object property
|
25249
25296
|
* represented by the selected option will be bound to the model identified by the `ngModel`
|
@@ -25258,28 +25305,51 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
25258
25305
|
* array of objects. See an example [in this jsfiddle](http://jsfiddle.net/qWzTb/).
|
25259
25306
|
* </div>
|
25260
25307
|
*
|
25261
|
-
* ## `select as
|
25308
|
+
* ## `select` **`as`**
|
25262
25309
|
*
|
25263
|
-
* Using `select as
|
25310
|
+
* Using `select` **`as`** will bind the result of the `select` expression to the model, but
|
25264
25311
|
* the value of the `<select>` and `<option>` html elements will be either the index (for array data sources)
|
25265
|
-
* or property name (for object data sources) of the value within the collection. If a
|
25312
|
+
* or property name (for object data sources) of the value within the collection. If a **`track by`** expression
|
25266
25313
|
* is used, the result of that expression will be set as the value of the `option` and `select` elements.
|
25267
25314
|
*
|
25268
|
-
*
|
25269
|
-
*
|
25270
|
-
*
|
25271
|
-
*
|
25272
|
-
*
|
25273
|
-
*
|
25274
|
-
*
|
25275
|
-
*
|
25276
|
-
*
|
25277
|
-
*
|
25278
|
-
*
|
25279
|
-
*
|
25280
|
-
*
|
25281
|
-
*
|
25282
|
-
*
|
25315
|
+
*
|
25316
|
+
* ### `select` **`as`** and **`track by`**
|
25317
|
+
*
|
25318
|
+
* <div class="alert alert-warning">
|
25319
|
+
* Do not use `select` **`as`** and **`track by`** in the same expression. They are not designed to work together.
|
25320
|
+
* </div>
|
25321
|
+
*
|
25322
|
+
* Consider the following example:
|
25323
|
+
*
|
25324
|
+
* ```html
|
25325
|
+
* <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
|
25326
|
+
* ```
|
25327
|
+
*
|
25328
|
+
* ```js
|
25329
|
+
* $scope.values = [{
|
25330
|
+
* id: 1,
|
25331
|
+
* label: 'aLabel',
|
25332
|
+
* subItem: { name: 'aSubItem' }
|
25333
|
+
* }, {
|
25334
|
+
* id: 2,
|
25335
|
+
* label: 'bLabel',
|
25336
|
+
* subItem: { name: 'bSubItem' }
|
25337
|
+
* }];
|
25338
|
+
*
|
25339
|
+
* $scope.selected = { name: 'aSubItem' };
|
25340
|
+
* ```
|
25341
|
+
*
|
25342
|
+
* With the purpose of preserving the selection, the **`track by`** expression is always applied to the element
|
25343
|
+
* of the data source (to `item` in this example). To calculate whether an element is selected, we do the
|
25344
|
+
* following:
|
25345
|
+
*
|
25346
|
+
* 1. Apply **`track by`** to the elements in the array. In the example: `[1, 2]`
|
25347
|
+
* 2. Apply **`track by`** to the already selected value in `ngModel`.
|
25348
|
+
* In the example: this is not possible as **`track by`** refers to `item.id`, but the selected
|
25349
|
+
* value from `ngModel` is `{name: 'aSubItem'}`, so the **`track by`** expression is applied to
|
25350
|
+
* a wrong object, the selected element can't be found, `<select>` is always reset to the "not
|
25351
|
+
* selected" option.
|
25352
|
+
*
|
25283
25353
|
*
|
25284
25354
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
25285
25355
|
* @param {string=} name Property name of the form under which the control is published.
|