angular-gem 1.3.5 → 1.3.6
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 +8 -8
- data/lib/angular-gem/version.rb +1 -1
- data/vendor/assets/javascripts/1.3.6/angular-animate.js +2137 -0
- data/vendor/assets/javascripts/1.3.6/angular-aria.js +332 -0
- data/vendor/assets/javascripts/1.3.6/angular-cookies.js +206 -0
- data/vendor/assets/javascripts/1.3.6/angular-loader.js +405 -0
- data/vendor/assets/javascripts/1.3.6/angular-messages.js +400 -0
- data/vendor/assets/javascripts/1.3.6/angular-mocks.js +2382 -0
- data/vendor/assets/javascripts/1.3.6/angular-resource.js +667 -0
- data/vendor/assets/javascripts/1.3.6/angular-route.js +995 -0
- data/vendor/assets/javascripts/1.3.6/angular-sanitize.js +680 -0
- data/vendor/assets/javascripts/1.3.6/angular-scenario.js +37354 -0
- data/vendor/assets/javascripts/1.3.6/angular-touch.js +622 -0
- data/vendor/assets/javascripts/1.3.6/angular.js +26000 -0
- data/vendor/assets/javascripts/angular-animate.js +121 -120
- data/vendor/assets/javascripts/angular-aria.js +39 -28
- 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 +7 -5
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +1 -2
- data/vendor/assets/javascripts/angular-sanitize.js +6 -4
- data/vendor/assets/javascripts/angular-scenario.js +282 -199
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +280 -197
- metadata +14 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.6
|
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.6/' +
|
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.6
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1119,7 +1119,7 @@ angular.mock.dump = function(object) {
|
|
1119
1119
|
```
|
1120
1120
|
*/
|
1121
1121
|
angular.mock.$HttpBackendProvider = function() {
|
1122
|
-
this.$get = ['$rootScope', createHttpBackendMock];
|
1122
|
+
this.$get = ['$rootScope', '$timeout', createHttpBackendMock];
|
1123
1123
|
};
|
1124
1124
|
|
1125
1125
|
/**
|
@@ -1136,7 +1136,7 @@ angular.mock.$HttpBackendProvider = function() {
|
|
1136
1136
|
* @param {Object=} $browser Auto-flushing enabled if specified
|
1137
1137
|
* @return {Object} Instance of $httpBackend mock
|
1138
1138
|
*/
|
1139
|
-
function createHttpBackendMock($rootScope, $delegate, $browser) {
|
1139
|
+
function createHttpBackendMock($rootScope, $timeout, $delegate, $browser) {
|
1140
1140
|
var definitions = [],
|
1141
1141
|
expectations = [],
|
1142
1142
|
responses = [],
|
@@ -1166,7 +1166,9 @@ function createHttpBackendMock($rootScope, $delegate, $browser) {
|
|
1166
1166
|
}
|
1167
1167
|
|
1168
1168
|
function wrapResponse(wrapped) {
|
1169
|
-
if (!$browser && timeout
|
1169
|
+
if (!$browser && timeout) {
|
1170
|
+
timeout.then ? timeout.then(handleTimeout) : $timeout(handleTimeout, timeout);
|
1171
|
+
}
|
1170
1172
|
|
1171
1173
|
return handleResponse;
|
1172
1174
|
|
@@ -2040,7 +2042,7 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
2040
2042
|
*/
|
2041
2043
|
angular.mock.e2e = {};
|
2042
2044
|
angular.mock.e2e.$httpBackendDecorator =
|
2043
|
-
['$rootScope', '$delegate', '$browser', createHttpBackendMock];
|
2045
|
+
['$rootScope', '$timeout', '$delegate', '$browser', createHttpBackendMock];
|
2044
2046
|
|
2045
2047
|
|
2046
2048
|
/**
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.6
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -788,7 +788,6 @@ ngRouteModule.directive('ngView', ngViewFillContentFactory);
|
|
788
788
|
.view-animate-container {
|
789
789
|
position:relative;
|
790
790
|
height:100px!important;
|
791
|
-
position:relative;
|
792
791
|
background:white;
|
793
792
|
border:1px solid black;
|
794
793
|
height:40px;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.6
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -628,7 +628,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
|
628
628
|
*/
|
629
629
|
angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
630
630
|
var LINKY_URL_REGEXP =
|
631
|
-
/((ftp|https?):\/\/|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"]/,
|
631
|
+
/((ftp|https?):\/\/|(www\.)|(mailto:)?[A-Za-z0-9._%+-]+@)\S*[^\s.;,(){}<>"”’]/,
|
632
632
|
MAILTO_REGEXP = /^mailto:/;
|
633
633
|
|
634
634
|
return function(text, target) {
|
@@ -641,8 +641,10 @@ angular.module('ngSanitize').filter('linky', ['$sanitize', function($sanitize) {
|
|
641
641
|
while ((match = raw.match(LINKY_URL_REGEXP))) {
|
642
642
|
// We can not end in these as they are sometimes found at the end of the sentence
|
643
643
|
url = match[0];
|
644
|
-
// if we did not match ftp/http/mailto then assume mailto
|
645
|
-
if (match[2]
|
644
|
+
// if we did not match ftp/http/www/mailto then assume mailto
|
645
|
+
if (!match[2] && !match[4]) {
|
646
|
+
url = (match[3] ? 'http://' : 'mailto:') + url;
|
647
|
+
}
|
646
648
|
i = match.index;
|
647
649
|
addText(raw.substr(0, i));
|
648
650
|
addLink(url, match[0].replace(MAILTO_REGEXP, ''));
|
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.3.
|
9193
|
+
* @license AngularJS v1.3.6
|
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.6/' +
|
9250
9250
|
(module ? module + '/' : '') + code;
|
9251
9251
|
for (i = 2; i < arguments.length; i++) {
|
9252
9252
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -10220,12 +10220,16 @@ function toJsonReplacer(key, value) {
|
|
10220
10220
|
* stripped since angular uses this notation internally.
|
10221
10221
|
*
|
10222
10222
|
* @param {Object|Array|Date|string|number} obj Input to be serialized into JSON.
|
10223
|
-
* @param {boolean=} pretty If set to true, the JSON output will contain newlines and whitespace.
|
10223
|
+
* @param {boolean|number=} pretty If set to true, the JSON output will contain newlines and whitespace.
|
10224
|
+
* If set to an integer, the JSON output will contain that many spaces per indentation (the default is 2).
|
10224
10225
|
* @returns {string|undefined} JSON-ified string representing `obj`.
|
10225
10226
|
*/
|
10226
10227
|
function toJson(obj, pretty) {
|
10227
10228
|
if (typeof obj === 'undefined') return undefined;
|
10228
|
-
|
10229
|
+
if (!isNumber(pretty)) {
|
10230
|
+
pretty = pretty ? 2 : null;
|
10231
|
+
}
|
10232
|
+
return JSON.stringify(obj, toJsonReplacer, pretty);
|
10229
10233
|
}
|
10230
10234
|
|
10231
10235
|
|
@@ -11273,7 +11277,8 @@ function toDebugString(obj) {
|
|
11273
11277
|
$TimeoutProvider,
|
11274
11278
|
$$RAFProvider,
|
11275
11279
|
$$AsyncCallbackProvider,
|
11276
|
-
$WindowProvider
|
11280
|
+
$WindowProvider,
|
11281
|
+
$$jqLiteProvider
|
11277
11282
|
*/
|
11278
11283
|
|
11279
11284
|
|
@@ -11292,11 +11297,11 @@ function toDebugString(obj) {
|
|
11292
11297
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11293
11298
|
*/
|
11294
11299
|
var version = {
|
11295
|
-
full: '1.3.
|
11300
|
+
full: '1.3.6', // all of these placeholder strings will be replaced by grunt's
|
11296
11301
|
major: 1, // package task
|
11297
11302
|
minor: 3,
|
11298
|
-
dot:
|
11299
|
-
codeName: '
|
11303
|
+
dot: 6,
|
11304
|
+
codeName: 'robofunky-danceblaster'
|
11300
11305
|
};
|
11301
11306
|
|
11302
11307
|
|
@@ -11426,7 +11431,8 @@ function publishExternalAPI(angular) {
|
|
11426
11431
|
$timeout: $TimeoutProvider,
|
11427
11432
|
$window: $WindowProvider,
|
11428
11433
|
$$rAF: $$RAFProvider,
|
11429
|
-
$$asyncCallback: $$AsyncCallbackProvider
|
11434
|
+
$$asyncCallback: $$AsyncCallbackProvider,
|
11435
|
+
$$jqLite: $$jqLiteProvider
|
11430
11436
|
});
|
11431
11437
|
}
|
11432
11438
|
]);
|
@@ -12436,6 +12442,27 @@ forEach({
|
|
12436
12442
|
JQLite.prototype.unbind = JQLite.prototype.off;
|
12437
12443
|
});
|
12438
12444
|
|
12445
|
+
|
12446
|
+
// Provider for private $$jqLite service
|
12447
|
+
function $$jqLiteProvider() {
|
12448
|
+
this.$get = function $$jqLite() {
|
12449
|
+
return extend(JQLite, {
|
12450
|
+
hasClass: function(node, classes) {
|
12451
|
+
if (node.attr) node = node[0];
|
12452
|
+
return jqLiteHasClass(node, classes);
|
12453
|
+
},
|
12454
|
+
addClass: function(node, classes) {
|
12455
|
+
if (node.attr) node = node[0];
|
12456
|
+
return jqLiteAddClass(node, classes);
|
12457
|
+
},
|
12458
|
+
removeClass: function(node, classes) {
|
12459
|
+
if (node.attr) node = node[0];
|
12460
|
+
return jqLiteRemoveClass(node, classes);
|
12461
|
+
}
|
12462
|
+
});
|
12463
|
+
};
|
12464
|
+
}
|
12465
|
+
|
12439
12466
|
/**
|
12440
12467
|
* Computes a hash of an 'obj'.
|
12441
12468
|
* Hash of a:
|
@@ -12688,6 +12715,7 @@ function annotate(fn, strictDi, name) {
|
|
12688
12715
|
* Return an instance of the service.
|
12689
12716
|
*
|
12690
12717
|
* @param {string} name The name of the instance to retrieve.
|
12718
|
+
* @param {string} caller An optional string to provide the origin of the function call for error messages.
|
12691
12719
|
* @return {*} The instance.
|
12692
12720
|
*/
|
12693
12721
|
|
@@ -13138,14 +13166,17 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13138
13166
|
}
|
13139
13167
|
},
|
13140
13168
|
providerInjector = (providerCache.$injector =
|
13141
|
-
createInternalInjector(providerCache, function() {
|
13169
|
+
createInternalInjector(providerCache, function(serviceName, caller) {
|
13170
|
+
if (angular.isString(caller)) {
|
13171
|
+
path.push(caller);
|
13172
|
+
}
|
13142
13173
|
throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));
|
13143
13174
|
})),
|
13144
13175
|
instanceCache = {},
|
13145
13176
|
instanceInjector = (instanceCache.$injector =
|
13146
|
-
createInternalInjector(instanceCache, function(
|
13147
|
-
var provider = providerInjector.get(
|
13148
|
-
return instanceInjector.invoke(provider.$get, provider, undefined,
|
13177
|
+
createInternalInjector(instanceCache, function(serviceName, caller) {
|
13178
|
+
var provider = providerInjector.get(serviceName + providerSuffix, caller);
|
13179
|
+
return instanceInjector.invoke(provider.$get, provider, undefined, serviceName);
|
13149
13180
|
}));
|
13150
13181
|
|
13151
13182
|
|
@@ -13180,7 +13211,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13180
13211
|
|
13181
13212
|
function enforceReturnValue(name, factory) {
|
13182
13213
|
return function enforcedReturnValue() {
|
13183
|
-
var result = instanceInjector.invoke(factory, this
|
13214
|
+
var result = instanceInjector.invoke(factory, this);
|
13184
13215
|
if (isUndefined(result)) {
|
13185
13216
|
throw $injectorMinErr('undef', "Provider '{0}' must return a value from $get factory method.", name);
|
13186
13217
|
}
|
@@ -13275,7 +13306,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13275
13306
|
|
13276
13307
|
function createInternalInjector(cache, factory) {
|
13277
13308
|
|
13278
|
-
function getService(serviceName) {
|
13309
|
+
function getService(serviceName, caller) {
|
13279
13310
|
if (cache.hasOwnProperty(serviceName)) {
|
13280
13311
|
if (cache[serviceName] === INSTANTIATING) {
|
13281
13312
|
throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
|
@@ -13286,7 +13317,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13286
13317
|
try {
|
13287
13318
|
path.unshift(serviceName);
|
13288
13319
|
cache[serviceName] = INSTANTIATING;
|
13289
|
-
return cache[serviceName] = factory(serviceName);
|
13320
|
+
return cache[serviceName] = factory(serviceName, caller);
|
13290
13321
|
} catch (err) {
|
13291
13322
|
if (cache[serviceName] === INSTANTIATING) {
|
13292
13323
|
delete cache[serviceName];
|
@@ -13318,7 +13349,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13318
13349
|
args.push(
|
13319
13350
|
locals && locals.hasOwnProperty(key)
|
13320
13351
|
? locals[key]
|
13321
|
-
: getService(key)
|
13352
|
+
: getService(key, serviceName)
|
13322
13353
|
);
|
13323
13354
|
}
|
13324
13355
|
if (isArray(fn)) {
|
@@ -14062,6 +14093,11 @@ function Browser(window, document, $log, $sniffer) {
|
|
14062
14093
|
}
|
14063
14094
|
}
|
14064
14095
|
|
14096
|
+
function getHash(url) {
|
14097
|
+
var index = url.indexOf('#');
|
14098
|
+
return index === -1 ? '' : url.substr(index + 1);
|
14099
|
+
}
|
14100
|
+
|
14065
14101
|
/**
|
14066
14102
|
* @private
|
14067
14103
|
* Note: this method is used only by scenario runner
|
@@ -14191,8 +14227,10 @@ function Browser(window, document, $log, $sniffer) {
|
|
14191
14227
|
}
|
14192
14228
|
if (replace) {
|
14193
14229
|
location.replace(url);
|
14194
|
-
} else {
|
14230
|
+
} else if (!sameBase) {
|
14195
14231
|
location.href = url;
|
14232
|
+
} else {
|
14233
|
+
location.hash = getHash(url);
|
14196
14234
|
}
|
14197
14235
|
}
|
14198
14236
|
return self;
|
@@ -14971,7 +15009,7 @@ function $TemplateCacheProvider() {
|
|
14971
15009
|
* #### `multiElement`
|
14972
15010
|
* When this property is set to true, the HTML compiler will collect DOM nodes between
|
14973
15011
|
* nodes with the attributes `directive-name-start` and `directive-name-end`, and group them
|
14974
|
-
* together as the directive elements. It is
|
15012
|
+
* together as the directive elements. It is recommended that this feature be used on directives
|
14975
15013
|
* which are not strictly behavioural (such as {@link ngClick}), and which
|
14976
15014
|
* do not manipulate or replace child nodes (such as {@link ngInclude}).
|
14977
15015
|
*
|
@@ -15763,6 +15801,21 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15763
15801
|
};
|
15764
15802
|
|
15765
15803
|
Attributes.prototype = {
|
15804
|
+
/**
|
15805
|
+
* @ngdoc method
|
15806
|
+
* @name $compile.directive.Attributes#$normalize
|
15807
|
+
* @kind function
|
15808
|
+
*
|
15809
|
+
* @description
|
15810
|
+
* Converts an attribute name (e.g. dash/colon/underscore-delimited string, optionally prefixed with `x-` or
|
15811
|
+
* `data-`) to its normalized, camelCase form.
|
15812
|
+
*
|
15813
|
+
* Also there is special case for Moz prefix starting with upper case letter.
|
15814
|
+
*
|
15815
|
+
* For further information check out the guide on {@link guide/directive#matching-directives Matching Directives}
|
15816
|
+
*
|
15817
|
+
* @param {string} name Name to normalize
|
15818
|
+
*/
|
15766
15819
|
$normalize: directiveNormalize,
|
15767
15820
|
|
15768
15821
|
|
@@ -17341,13 +17394,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17341
17394
|
var PREFIX_REGEXP = /^((?:x|data)[\:\-_])/i;
|
17342
17395
|
/**
|
17343
17396
|
* Converts all accepted directives format into proper directive name.
|
17344
|
-
* All of these will become 'myDirective':
|
17345
|
-
* my:Directive
|
17346
|
-
* my-directive
|
17347
|
-
* x-my-directive
|
17348
|
-
* data-my:directive
|
17349
|
-
*
|
17350
|
-
* Also there is special case for Moz prefix starting with upper case letter.
|
17351
17397
|
* @param name Name to normalize
|
17352
17398
|
*/
|
17353
17399
|
function directiveNormalize(name) {
|
@@ -18700,8 +18746,7 @@ function $HttpProvider() {
|
|
18700
18746
|
if (isDefined(cachedResp)) {
|
18701
18747
|
if (isPromiseLike(cachedResp)) {
|
18702
18748
|
// cached request has already been sent, but there is no response yet
|
18703
|
-
cachedResp.then(
|
18704
|
-
return cachedResp;
|
18749
|
+
cachedResp.then(resolvePromiseWithResult, resolvePromiseWithResult);
|
18705
18750
|
} else {
|
18706
18751
|
// serving from cache
|
18707
18752
|
if (isArray(cachedResp)) {
|
@@ -18779,6 +18824,9 @@ function $HttpProvider() {
|
|
18779
18824
|
});
|
18780
18825
|
}
|
18781
18826
|
|
18827
|
+
function resolvePromiseWithResult(result) {
|
18828
|
+
resolvePromise(result.data, result.status, shallowCopy(result.headers()), result.statusText);
|
18829
|
+
}
|
18782
18830
|
|
18783
18831
|
function removePendingReq() {
|
18784
18832
|
var idx = $http.pendingRequests.indexOf(config);
|
@@ -19390,33 +19438,33 @@ function $IntervalProvider() {
|
|
19390
19438
|
* // Don't start a new fight if we are already fighting
|
19391
19439
|
* if ( angular.isDefined(stop) ) return;
|
19392
19440
|
*
|
19393
|
-
*
|
19394
|
-
*
|
19395
|
-
*
|
19396
|
-
*
|
19397
|
-
*
|
19398
|
-
*
|
19399
|
-
*
|
19400
|
-
*
|
19401
|
-
*
|
19441
|
+
* stop = $interval(function() {
|
19442
|
+
* if ($scope.blood_1 > 0 && $scope.blood_2 > 0) {
|
19443
|
+
* $scope.blood_1 = $scope.blood_1 - 3;
|
19444
|
+
* $scope.blood_2 = $scope.blood_2 - 4;
|
19445
|
+
* } else {
|
19446
|
+
* $scope.stopFight();
|
19447
|
+
* }
|
19448
|
+
* }, 100);
|
19449
|
+
* };
|
19402
19450
|
*
|
19403
|
-
*
|
19404
|
-
*
|
19405
|
-
*
|
19406
|
-
*
|
19407
|
-
*
|
19408
|
-
*
|
19451
|
+
* $scope.stopFight = function() {
|
19452
|
+
* if (angular.isDefined(stop)) {
|
19453
|
+
* $interval.cancel(stop);
|
19454
|
+
* stop = undefined;
|
19455
|
+
* }
|
19456
|
+
* };
|
19409
19457
|
*
|
19410
|
-
*
|
19411
|
-
*
|
19412
|
-
*
|
19413
|
-
*
|
19458
|
+
* $scope.resetFight = function() {
|
19459
|
+
* $scope.blood_1 = 100;
|
19460
|
+
* $scope.blood_2 = 120;
|
19461
|
+
* };
|
19414
19462
|
*
|
19415
|
-
*
|
19416
|
-
*
|
19417
|
-
*
|
19418
|
-
*
|
19419
|
-
*
|
19463
|
+
* $scope.$on('$destroy', function() {
|
19464
|
+
* // Make sure that the interval is destroyed too
|
19465
|
+
* $scope.stopFight();
|
19466
|
+
* });
|
19467
|
+
* }])
|
19420
19468
|
* // Register the 'myCurrentTime' directive factory method.
|
19421
19469
|
* // We inject $interval and dateFilter service since the factory method is DI.
|
19422
19470
|
* .directive('myCurrentTime', ['$interval', 'dateFilter',
|
@@ -19659,6 +19707,10 @@ function stripHash(url) {
|
|
19659
19707
|
return index == -1 ? url : url.substr(0, index);
|
19660
19708
|
}
|
19661
19709
|
|
19710
|
+
function trimEmptyHash(url) {
|
19711
|
+
return url.replace(/(#.+)|#$/, '$1');
|
19712
|
+
}
|
19713
|
+
|
19662
19714
|
|
19663
19715
|
function stripFile(url) {
|
19664
19716
|
return url.substr(0, stripHash(url).lastIndexOf('/') + 1);
|
@@ -19770,16 +19822,25 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
19770
19822
|
*/
|
19771
19823
|
this.$$parse = function(url) {
|
19772
19824
|
var withoutBaseUrl = beginsWith(appBase, url) || beginsWith(appBaseNoFile, url);
|
19773
|
-
var withoutHashUrl
|
19774
|
-
|
19775
|
-
|
19776
|
-
|
19777
|
-
|
19825
|
+
var withoutHashUrl;
|
19826
|
+
|
19827
|
+
if (withoutBaseUrl.charAt(0) === '#') {
|
19828
|
+
|
19829
|
+
// The rest of the url starts with a hash so we have
|
19830
|
+
// got either a hashbang path or a plain hash fragment
|
19831
|
+
withoutHashUrl = beginsWith(hashPrefix, withoutBaseUrl);
|
19832
|
+
if (isUndefined(withoutHashUrl)) {
|
19833
|
+
// There was no hashbang prefix so we just have a hash fragment
|
19834
|
+
withoutHashUrl = withoutBaseUrl;
|
19835
|
+
}
|
19778
19836
|
|
19779
|
-
|
19780
|
-
|
19781
|
-
|
19837
|
+
} else {
|
19838
|
+
// There was no hashbang path nor hash fragment:
|
19839
|
+
// If we are in HTML5 mode we use what is left as the path;
|
19840
|
+
// Otherwise we ignore what is left
|
19841
|
+
withoutHashUrl = this.$$html5 ? withoutBaseUrl : '';
|
19782
19842
|
}
|
19843
|
+
|
19783
19844
|
parseAppUrl(withoutHashUrl, this);
|
19784
19845
|
|
19785
19846
|
this.$$path = removeWindowsDriveName(this.$$path, withoutHashUrl, appBase);
|
@@ -20142,7 +20203,7 @@ var locationPrototype = {
|
|
20142
20203
|
*
|
20143
20204
|
*
|
20144
20205
|
* ```js
|
20145
|
-
* // given url http://example.com
|
20206
|
+
* // given url http://example.com/#/some/path?foo=bar&baz=xoxo#hashValue
|
20146
20207
|
* var hash = $location.hash();
|
20147
20208
|
* // => "hashValue"
|
20148
20209
|
* ```
|
@@ -20494,10 +20555,11 @@ function $LocationProvider() {
|
|
20494
20555
|
|
20495
20556
|
// update browser
|
20496
20557
|
$rootScope.$watch(function $locationWatch() {
|
20497
|
-
var oldUrl = $browser.url();
|
20558
|
+
var oldUrl = trimEmptyHash($browser.url());
|
20559
|
+
var newUrl = trimEmptyHash($location.absUrl());
|
20498
20560
|
var oldState = $browser.state();
|
20499
20561
|
var currentReplace = $location.$$replace;
|
20500
|
-
var urlOrStateChanged = oldUrl !==
|
20562
|
+
var urlOrStateChanged = oldUrl !== newUrl ||
|
20501
20563
|
($location.$$html5 && $sniffer.history && oldState !== $location.$$state);
|
20502
20564
|
|
20503
20565
|
if (initializing || urlOrStateChanged) {
|
@@ -21300,8 +21362,8 @@ Parser.prototype = {
|
|
21300
21362
|
logicalAND: function() {
|
21301
21363
|
var left = this.equality();
|
21302
21364
|
var token;
|
21303
|
-
|
21304
|
-
left = this.binaryFn(left, token.text, this.
|
21365
|
+
while ((token = this.expect('&&'))) {
|
21366
|
+
left = this.binaryFn(left, token.text, this.equality(), true);
|
21305
21367
|
}
|
21306
21368
|
return left;
|
21307
21369
|
},
|
@@ -21309,8 +21371,8 @@ Parser.prototype = {
|
|
21309
21371
|
equality: function() {
|
21310
21372
|
var left = this.relational();
|
21311
21373
|
var token;
|
21312
|
-
|
21313
|
-
left = this.binaryFn(left, token.text, this.
|
21374
|
+
while ((token = this.expect('==','!=','===','!=='))) {
|
21375
|
+
left = this.binaryFn(left, token.text, this.relational());
|
21314
21376
|
}
|
21315
21377
|
return left;
|
21316
21378
|
},
|
@@ -21318,8 +21380,8 @@ Parser.prototype = {
|
|
21318
21380
|
relational: function() {
|
21319
21381
|
var left = this.additive();
|
21320
21382
|
var token;
|
21321
|
-
|
21322
|
-
left = this.binaryFn(left, token.text, this.
|
21383
|
+
while ((token = this.expect('<', '>', '<=', '>='))) {
|
21384
|
+
left = this.binaryFn(left, token.text, this.additive());
|
21323
21385
|
}
|
21324
21386
|
return left;
|
21325
21387
|
},
|
@@ -21411,7 +21473,7 @@ Parser.prototype = {
|
|
21411
21473
|
var args = argsFn.length ? [] : null;
|
21412
21474
|
|
21413
21475
|
return function $parseFunctionCall(scope, locals) {
|
21414
|
-
var context = contextGetter ? contextGetter(scope, locals) : scope;
|
21476
|
+
var context = contextGetter ? contextGetter(scope, locals) : isDefined(contextGetter) ? undefined : scope;
|
21415
21477
|
var fn = fnGetter(scope, locals, context) || noop;
|
21416
21478
|
|
21417
21479
|
if (args) {
|
@@ -25066,7 +25128,9 @@ function $SnifferProvider() {
|
|
25066
25128
|
// IE9 implements 'input' event it's so fubared that we rather pretend that it doesn't have
|
25067
25129
|
// it. In particular the event is not fired when backspace or delete key are pressed or
|
25068
25130
|
// when cut operation is performed.
|
25069
|
-
|
25131
|
+
// IE10+ implements 'input' event but it erroneously fires under various situations,
|
25132
|
+
// e.g. when placeholder changes, or a form is focused.
|
25133
|
+
if (event === 'input' && msie <= 11) return false;
|
25070
25134
|
|
25071
25135
|
if (isUndefined(eventSupport[event])) {
|
25072
25136
|
var divElm = document.createElement('div');
|
@@ -25126,10 +25190,8 @@ function $TemplateRequestProvider() {
|
|
25126
25190
|
|
25127
25191
|
return $http.get(tpl, httpOptions)
|
25128
25192
|
.then(function(response) {
|
25129
|
-
var html = response.data;
|
25130
25193
|
self.totalPendingRequests--;
|
25131
|
-
|
25132
|
-
return html;
|
25194
|
+
return response.data;
|
25133
25195
|
}, handleError);
|
25134
25196
|
|
25135
25197
|
function handleError(resp) {
|
@@ -25760,106 +25822,103 @@ function filterFilter() {
|
|
25760
25822
|
return function(array, expression, comparator) {
|
25761
25823
|
if (!isArray(array)) return array;
|
25762
25824
|
|
25763
|
-
var
|
25764
|
-
|
25765
|
-
|
25766
|
-
predicates.check = function(value, index) {
|
25767
|
-
for (var j = 0; j < predicates.length; j++) {
|
25768
|
-
if (!predicates[j](value, index)) {
|
25769
|
-
return false;
|
25770
|
-
}
|
25771
|
-
}
|
25772
|
-
return true;
|
25773
|
-
};
|
25825
|
+
var predicateFn;
|
25826
|
+
var matchAgainstAnyProp;
|
25774
25827
|
|
25775
|
-
if (comparatorType !== 'function') {
|
25776
|
-
if (comparatorType === 'boolean' && comparator) {
|
25777
|
-
comparator = function(obj, text) {
|
25778
|
-
return angular.equals(obj, text);
|
25779
|
-
};
|
25780
|
-
} else {
|
25781
|
-
comparator = function(obj, text) {
|
25782
|
-
if (obj && text && typeof obj === 'object' && typeof text === 'object') {
|
25783
|
-
for (var objKey in obj) {
|
25784
|
-
if (objKey.charAt(0) !== '$' && hasOwnProperty.call(obj, objKey) &&
|
25785
|
-
comparator(obj[objKey], text[objKey])) {
|
25786
|
-
return true;
|
25787
|
-
}
|
25788
|
-
}
|
25789
|
-
return false;
|
25790
|
-
}
|
25791
|
-
text = ('' + text).toLowerCase();
|
25792
|
-
return ('' + obj).toLowerCase().indexOf(text) > -1;
|
25793
|
-
};
|
25794
|
-
}
|
25795
|
-
}
|
25796
|
-
|
25797
|
-
var search = function(obj, text) {
|
25798
|
-
if (typeof text === 'string' && text.charAt(0) === '!') {
|
25799
|
-
return !search(obj, text.substr(1));
|
25800
|
-
}
|
25801
|
-
switch (typeof obj) {
|
25802
|
-
case 'boolean':
|
25803
|
-
case 'number':
|
25804
|
-
case 'string':
|
25805
|
-
return comparator(obj, text);
|
25806
|
-
case 'object':
|
25807
|
-
switch (typeof text) {
|
25808
|
-
case 'object':
|
25809
|
-
return comparator(obj, text);
|
25810
|
-
default:
|
25811
|
-
for (var objKey in obj) {
|
25812
|
-
if (objKey.charAt(0) !== '$' && search(obj[objKey], text)) {
|
25813
|
-
return true;
|
25814
|
-
}
|
25815
|
-
}
|
25816
|
-
break;
|
25817
|
-
}
|
25818
|
-
return false;
|
25819
|
-
case 'array':
|
25820
|
-
for (var i = 0; i < obj.length; i++) {
|
25821
|
-
if (search(obj[i], text)) {
|
25822
|
-
return true;
|
25823
|
-
}
|
25824
|
-
}
|
25825
|
-
return false;
|
25826
|
-
default:
|
25827
|
-
return false;
|
25828
|
-
}
|
25829
|
-
};
|
25830
25828
|
switch (typeof expression) {
|
25829
|
+
case 'function':
|
25830
|
+
predicateFn = expression;
|
25831
|
+
break;
|
25831
25832
|
case 'boolean':
|
25832
25833
|
case 'number':
|
25833
25834
|
case 'string':
|
25834
|
-
|
25835
|
-
|
25836
|
-
// jshint -W086
|
25835
|
+
matchAgainstAnyProp = true;
|
25836
|
+
//jshint -W086
|
25837
25837
|
case 'object':
|
25838
|
-
//
|
25839
|
-
|
25840
|
-
(function(path) {
|
25841
|
-
if (typeof expression[path] === 'undefined') return;
|
25842
|
-
predicates.push(function(value) {
|
25843
|
-
return search(path == '$' ? value : (value && value[path]), expression[path]);
|
25844
|
-
});
|
25845
|
-
})(key);
|
25846
|
-
}
|
25847
|
-
break;
|
25848
|
-
case 'function':
|
25849
|
-
predicates.push(expression);
|
25838
|
+
//jshint +W086
|
25839
|
+
predicateFn = createPredicateFn(expression, comparator, matchAgainstAnyProp);
|
25850
25840
|
break;
|
25851
25841
|
default:
|
25852
25842
|
return array;
|
25853
25843
|
}
|
25854
|
-
|
25855
|
-
|
25856
|
-
|
25857
|
-
|
25858
|
-
|
25844
|
+
|
25845
|
+
return array.filter(predicateFn);
|
25846
|
+
};
|
25847
|
+
}
|
25848
|
+
|
25849
|
+
// Helper functions for `filterFilter`
|
25850
|
+
function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
25851
|
+
var predicateFn;
|
25852
|
+
|
25853
|
+
if (comparator === true) {
|
25854
|
+
comparator = equals;
|
25855
|
+
} else if (!isFunction(comparator)) {
|
25856
|
+
comparator = function(actual, expected) {
|
25857
|
+
if (isObject(actual) || isObject(expected)) {
|
25858
|
+
// Prevent an object to be considered equal to a string like `'[object'`
|
25859
|
+
return false;
|
25859
25860
|
}
|
25860
|
-
|
25861
|
-
|
25861
|
+
|
25862
|
+
actual = lowercase('' + actual);
|
25863
|
+
expected = lowercase('' + expected);
|
25864
|
+
return actual.indexOf(expected) !== -1;
|
25865
|
+
};
|
25866
|
+
}
|
25867
|
+
|
25868
|
+
predicateFn = function(item) {
|
25869
|
+
return deepCompare(item, expression, comparator, matchAgainstAnyProp);
|
25862
25870
|
};
|
25871
|
+
|
25872
|
+
return predicateFn;
|
25873
|
+
}
|
25874
|
+
|
25875
|
+
function deepCompare(actual, expected, comparator, matchAgainstAnyProp) {
|
25876
|
+
var actualType = typeof actual;
|
25877
|
+
var expectedType = typeof expected;
|
25878
|
+
|
25879
|
+
if ((expectedType === 'string') && (expected.charAt(0) === '!')) {
|
25880
|
+
return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp);
|
25881
|
+
} else if (actualType === 'array') {
|
25882
|
+
// In case `actual` is an array, consider it a match
|
25883
|
+
// if ANY of it's items matches `expected`
|
25884
|
+
return actual.some(function(item) {
|
25885
|
+
return deepCompare(item, expected, comparator, matchAgainstAnyProp);
|
25886
|
+
});
|
25887
|
+
}
|
25888
|
+
|
25889
|
+
switch (actualType) {
|
25890
|
+
case 'object':
|
25891
|
+
var key;
|
25892
|
+
if (matchAgainstAnyProp) {
|
25893
|
+
for (key in actual) {
|
25894
|
+
if ((key.charAt(0) !== '$') && deepCompare(actual[key], expected, comparator)) {
|
25895
|
+
return true;
|
25896
|
+
}
|
25897
|
+
}
|
25898
|
+
return false;
|
25899
|
+
} else if (expectedType === 'object') {
|
25900
|
+
for (key in expected) {
|
25901
|
+
var expectedVal = expected[key];
|
25902
|
+
if (isFunction(expectedVal)) {
|
25903
|
+
continue;
|
25904
|
+
}
|
25905
|
+
|
25906
|
+
var keyIsDollar = key === '$';
|
25907
|
+
var actualVal = keyIsDollar ? actual : actual[key];
|
25908
|
+
if (!deepCompare(actualVal, expectedVal, comparator, keyIsDollar)) {
|
25909
|
+
return false;
|
25910
|
+
}
|
25911
|
+
}
|
25912
|
+
return true;
|
25913
|
+
} else {
|
25914
|
+
return comparator(actual, expected);
|
25915
|
+
}
|
25916
|
+
break;
|
25917
|
+
case 'function':
|
25918
|
+
return false;
|
25919
|
+
default:
|
25920
|
+
return comparator(actual, expected);
|
25921
|
+
}
|
25863
25922
|
}
|
25864
25923
|
|
25865
25924
|
/**
|
@@ -26012,7 +26071,6 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26012
26071
|
if (numStr.indexOf('e') !== -1) {
|
26013
26072
|
var match = numStr.match(/([\d\.]+)e(-?)(\d+)/);
|
26014
26073
|
if (match && match[2] == '-' && match[3] > fractionSize + 1) {
|
26015
|
-
numStr = '0';
|
26016
26074
|
number = 0;
|
26017
26075
|
} else {
|
26018
26076
|
formatedText = numStr;
|
@@ -26033,10 +26091,6 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26033
26091
|
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round
|
26034
26092
|
number = +(Math.round(+(number.toString() + 'e' + fractionSize)).toString() + 'e' + -fractionSize);
|
26035
26093
|
|
26036
|
-
if (number === 0) {
|
26037
|
-
isNegative = false;
|
26038
|
-
}
|
26039
|
-
|
26040
26094
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
26041
26095
|
var whole = fraction[0];
|
26042
26096
|
fraction = fraction[1] || '';
|
@@ -26069,12 +26123,16 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
26069
26123
|
|
26070
26124
|
if (fractionSize && fractionSize !== "0") formatedText += decimalSep + fraction.substr(0, fractionSize);
|
26071
26125
|
} else {
|
26072
|
-
|
26073
|
-
if (fractionSize > 0 && number > -1 && number < 1) {
|
26126
|
+
if (fractionSize > 0 && number < 1) {
|
26074
26127
|
formatedText = number.toFixed(fractionSize);
|
26128
|
+
number = parseFloat(formatedText);
|
26075
26129
|
}
|
26076
26130
|
}
|
26077
26131
|
|
26132
|
+
if (number === 0) {
|
26133
|
+
isNegative = false;
|
26134
|
+
}
|
26135
|
+
|
26078
26136
|
parts.push(isNegative ? pattern.negPre : pattern.posPre,
|
26079
26137
|
formatedText,
|
26080
26138
|
isNegative ? pattern.negSuf : pattern.posSuf);
|
@@ -26364,25 +26422,31 @@ function dateFilter($locale) {
|
|
26364
26422
|
* the binding is automatically converted to JSON.
|
26365
26423
|
*
|
26366
26424
|
* @param {*} object Any JavaScript object (including arrays and primitive types) to filter.
|
26425
|
+
* @param {number=} spacing The number of spaces to use per indentation, defaults to 2.
|
26367
26426
|
* @returns {string} JSON string.
|
26368
26427
|
*
|
26369
26428
|
*
|
26370
26429
|
* @example
|
26371
26430
|
<example>
|
26372
26431
|
<file name="index.html">
|
26373
|
-
<pre>{{ {'name':'value'} | json }}</pre>
|
26432
|
+
<pre id="default-spacing">{{ {'name':'value'} | json }}</pre>
|
26433
|
+
<pre id="custom-spacing">{{ {'name':'value'} | json:4 }}</pre>
|
26374
26434
|
</file>
|
26375
26435
|
<file name="protractor.js" type="protractor">
|
26376
26436
|
it('should jsonify filtered objects', function() {
|
26377
|
-
expect(element(by.
|
26437
|
+
expect(element(by.id('default-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
|
26438
|
+
expect(element(by.id('custom-spacing')).getText()).toMatch(/\{\n "name": ?"value"\n}/);
|
26378
26439
|
});
|
26379
26440
|
</file>
|
26380
26441
|
</example>
|
26381
26442
|
*
|
26382
26443
|
*/
|
26383
26444
|
function jsonFilter() {
|
26384
|
-
return function(object) {
|
26385
|
-
|
26445
|
+
return function(object, spacing) {
|
26446
|
+
if (isUndefined(spacing)) {
|
26447
|
+
spacing = 2;
|
26448
|
+
}
|
26449
|
+
return toJson(object, spacing);
|
26386
26450
|
};
|
26387
26451
|
}
|
26388
26452
|
|
@@ -26702,12 +26766,29 @@ function orderByFilter($parse) {
|
|
26702
26766
|
function compare(v1, v2) {
|
26703
26767
|
var t1 = typeof v1;
|
26704
26768
|
var t2 = typeof v2;
|
26705
|
-
|
26706
|
-
|
26707
|
-
|
26708
|
-
|
26709
|
-
|
26710
|
-
|
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
|
+
if (t1 === t2 && t1 === "object") {
|
26774
|
+
// If types are both numbers, emulate abstract ToPrimitive() operation
|
26775
|
+
// in order to get primitive values suitable for comparison
|
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
|
+
}
|
26789
|
+
}
|
26790
|
+
if (t1 === t2) {
|
26791
|
+
if (t1 === "string") {
|
26711
26792
|
v1 = v1.toLowerCase();
|
26712
26793
|
v2 = v2.toLowerCase();
|
26713
26794
|
}
|
@@ -28656,7 +28737,6 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28656
28737
|
}
|
28657
28738
|
|
28658
28739
|
function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
28659
|
-
var placeholder = element[0].placeholder, noevent = {};
|
28660
28740
|
var type = lowercase(element[0].type);
|
28661
28741
|
|
28662
28742
|
// In composition mode, users are still inputing intermediate text buffer,
|
@@ -28676,19 +28756,14 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28676
28756
|
}
|
28677
28757
|
|
28678
28758
|
var listener = function(ev) {
|
28759
|
+
if (timeout) {
|
28760
|
+
$browser.defer.cancel(timeout);
|
28761
|
+
timeout = null;
|
28762
|
+
}
|
28679
28763
|
if (composing) return;
|
28680
28764
|
var value = element.val(),
|
28681
28765
|
event = ev && ev.type;
|
28682
28766
|
|
28683
|
-
// IE (11 and under) seem to emit an 'input' event if the placeholder value changes.
|
28684
|
-
// We don't want to dirty the value when this happens, so we abort here. Unfortunately,
|
28685
|
-
// IE also sends input events for other non-input-related things, (such as focusing on a
|
28686
|
-
// form control), so this change is not entirely enough to solve this.
|
28687
|
-
if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {
|
28688
|
-
placeholder = element[0].placeholder;
|
28689
|
-
return;
|
28690
|
-
}
|
28691
|
-
|
28692
28767
|
// By default we will trim the value
|
28693
28768
|
// If the attribute ng-trim exists we will avoid trimming
|
28694
28769
|
// If input type is 'password', the value is never trimmed
|
@@ -28711,11 +28786,13 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28711
28786
|
} else {
|
28712
28787
|
var timeout;
|
28713
28788
|
|
28714
|
-
var deferListener = function(ev) {
|
28789
|
+
var deferListener = function(ev, input, origValue) {
|
28715
28790
|
if (!timeout) {
|
28716
28791
|
timeout = $browser.defer(function() {
|
28717
|
-
listener(ev);
|
28718
28792
|
timeout = null;
|
28793
|
+
if (!input || input.value !== origValue) {
|
28794
|
+
listener(ev);
|
28795
|
+
}
|
28719
28796
|
});
|
28720
28797
|
}
|
28721
28798
|
};
|
@@ -28727,7 +28804,7 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
28727
28804
|
// command modifiers arrows
|
28728
28805
|
if (key === 91 || (15 < key && key < 19) || (37 <= key && key <= 40)) return;
|
28729
28806
|
|
28730
|
-
deferListener(event);
|
28807
|
+
deferListener(event, this, this.value);
|
28731
28808
|
});
|
28732
28809
|
|
28733
28810
|
// if user modifies input value using context menu in IE, we need "paste" and "cut" events to catch it
|
@@ -29902,11 +29979,15 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
29902
29979
|
var prevModelValue = ctrl.$modelValue;
|
29903
29980
|
var allowInvalid = ctrl.$options && ctrl.$options.allowInvalid;
|
29904
29981
|
ctrl.$$rawModelValue = modelValue;
|
29982
|
+
|
29905
29983
|
if (allowInvalid) {
|
29906
29984
|
ctrl.$modelValue = modelValue;
|
29907
29985
|
writeToModelIfNeeded();
|
29908
29986
|
}
|
29909
|
-
|
29987
|
+
|
29988
|
+
// Pass the $$lastCommittedViewValue here, because the cached viewValue might be out of date.
|
29989
|
+
// This can happen if e.g. $setViewValue is called from inside a parser
|
29990
|
+
ctrl.$$runValidators(parserValid, modelValue, ctrl.$$lastCommittedViewValue, function(allValid) {
|
29910
29991
|
if (!allowInvalid) {
|
29911
29992
|
// Note: Don't check ctrl.$valid here, as we could have
|
29912
29993
|
// external validators (e.g. calculated on the server),
|
@@ -34248,7 +34329,7 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
34248
34329
|
}]);
|
34249
34330
|
</script>
|
34250
34331
|
<div ng-controller="ExampleController">
|
34251
|
-
<input ng-model="title"
|
34332
|
+
<input ng-model="title"> <br/>
|
34252
34333
|
<textarea ng-model="text"></textarea> <br/>
|
34253
34334
|
<pane title="{{title}}">{{text}}</pane>
|
34254
34335
|
</div>
|
@@ -34376,9 +34457,9 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34376
34457
|
* or property name (for object data sources) of the value within the collection. If a `track by` expression
|
34377
34458
|
* is used, the result of that expression will be set as the value of the `option` and `select` elements.
|
34378
34459
|
*
|
34379
|
-
* ### `select as` with `
|
34460
|
+
* ### `select as` with `track by`
|
34380
34461
|
*
|
34381
|
-
* Using `select as` together with `
|
34462
|
+
* Using `select as` together with `track by` is not recommended. Reasoning:
|
34382
34463
|
*
|
34383
34464
|
* - Example: <select ng-options="item.subItem as item.label for item in values track by item.id" ng-model="selected">
|
34384
34465
|
* values: [{id: 1, label: 'aLabel', subItem: {name: 'aSubItem'}}, {id: 2, label: 'bLabel', subItem: {name: 'bSubItem'}}],
|
@@ -34403,8 +34484,10 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
34403
34484
|
* * for array data sources:
|
34404
34485
|
* * `label` **`for`** `value` **`in`** `array`
|
34405
34486
|
* * `select` **`as`** `label` **`for`** `value` **`in`** `array`
|
34406
|
-
* * `label`
|
34407
|
-
* * `
|
34487
|
+
* * `label` **`group by`** `group` **`for`** `value` **`in`** `array`
|
34488
|
+
* * `label` **`group by`** `group` **`for`** `value` **`in`** `array` **`track by`** `trackexpr`
|
34489
|
+
* * `label` **`for`** `value` **`in`** `array` | orderBy:`orderexpr` **`track by`** `trackexpr`
|
34490
|
+
* (for including a filter with `track by`)
|
34408
34491
|
* * for object data sources:
|
34409
34492
|
* * `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
|
34410
34493
|
* * `select` **`as`** `label` **`for (`**`key` **`,`** `value`**`) in`** `object`
|
@@ -36690,7 +36773,7 @@ angular.scenario.dsl('binding', function() {
|
|
36690
36773
|
*/
|
36691
36774
|
angular.scenario.dsl('input', function() {
|
36692
36775
|
var chain = {};
|
36693
|
-
var supportInputEvent =
|
36776
|
+
var supportInputEvent = 'oninput' in document.createElement('div') && !(msie && msie <= 11);
|
36694
36777
|
|
36695
36778
|
chain.enter = function(value, event) {
|
36696
36779
|
return this.addFutureAction("input '" + this.name + "' enter '" + value + "'",
|