rails-angularjs 1.4.0 → 1.4.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/rails-angularjs/version.rb +1 -1
- data/vendor/assets/javascripts/angular-animate.js +4 -3
- data/vendor/assets/javascripts/angular-animate.min.js +1 -1
- data/vendor/assets/javascripts/angular-animate.min.js.map +1 -1
- data/vendor/assets/javascripts/angular-aria.js +20 -11
- data/vendor/assets/javascripts/angular-aria.min.js +8 -8
- data/vendor/assets/javascripts/angular-aria.min.js.map +2 -2
- data/vendor/assets/javascripts/angular-cookies.js +2 -2
- data/vendor/assets/javascripts/angular-cookies.min.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +23 -10
- data/vendor/assets/javascripts/angular-loader.min.js +4 -4
- data/vendor/assets/javascripts/angular-loader.min.js.map +2 -2
- data/vendor/assets/javascripts/angular-message-format.js +1 -1
- data/vendor/assets/javascripts/angular-message-format.min.js +1 -1
- data/vendor/assets/javascripts/angular-messages.js +3 -3
- data/vendor/assets/javascripts/angular-messages.min.js +1 -1
- data/vendor/assets/javascripts/angular-mocks.js +2 -2
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-resource.min.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +1 -1
- data/vendor/assets/javascripts/angular-route.min.js +1 -1
- data/vendor/assets/javascripts/angular-sanitize.js +4 -4
- data/vendor/assets/javascripts/angular-sanitize.min.js +4 -4
- data/vendor/assets/javascripts/angular-sanitize.min.js.map +1 -1
- data/vendor/assets/javascripts/angular-scenario.js +271 -110
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular-touch.min.js +1 -1
- data/vendor/assets/javascripts/angular.js +271 -110
- data/vendor/assets/javascripts/angular.min.js +284 -283
- data/vendor/assets/javascripts/angular.min.js.map +3 -3
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.4.
|
2
|
+
* @license AngularJS v1.4.1
|
3
3
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -57,7 +57,7 @@ function minErr(module, ErrorConstructor) {
|
|
57
57
|
return match;
|
58
58
|
});
|
59
59
|
|
60
|
-
message += '\nhttp://errors.angularjs.org/1.4.
|
60
|
+
message += '\nhttp://errors.angularjs.org/1.4.1/' +
|
61
61
|
(module ? module + '/' : '') + code;
|
62
62
|
|
63
63
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -864,9 +864,18 @@ function copy(source, destination, stackSource, stackDest) {
|
|
864
864
|
|
865
865
|
if (!destination) {
|
866
866
|
destination = source;
|
867
|
-
if (source) {
|
867
|
+
if (isObject(source)) {
|
868
|
+
var index;
|
869
|
+
if (stackSource && (index = stackSource.indexOf(source)) !== -1) {
|
870
|
+
return stackDest[index];
|
871
|
+
}
|
872
|
+
|
873
|
+
// TypedArray, Date and RegExp have specific copy functionality and must be
|
874
|
+
// pushed onto the stack before returning.
|
875
|
+
// Array and other objects create the base object and recurse to copy child
|
876
|
+
// objects. The array/object will be pushed onto the stack when recursed.
|
868
877
|
if (isArray(source)) {
|
869
|
-
|
878
|
+
return copy(source, [], stackSource, stackDest);
|
870
879
|
} else if (isTypedArray(source)) {
|
871
880
|
destination = new source.constructor(source);
|
872
881
|
} else if (isDate(source)) {
|
@@ -874,9 +883,14 @@ function copy(source, destination, stackSource, stackDest) {
|
|
874
883
|
} else if (isRegExp(source)) {
|
875
884
|
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
|
876
885
|
destination.lastIndex = source.lastIndex;
|
877
|
-
} else
|
886
|
+
} else {
|
878
887
|
var emptyObject = Object.create(getPrototypeOf(source));
|
879
|
-
|
888
|
+
return copy(source, emptyObject, stackSource, stackDest);
|
889
|
+
}
|
890
|
+
|
891
|
+
if (stackDest) {
|
892
|
+
stackSource.push(source);
|
893
|
+
stackDest.push(destination);
|
880
894
|
}
|
881
895
|
}
|
882
896
|
} else {
|
@@ -887,9 +901,6 @@ function copy(source, destination, stackSource, stackDest) {
|
|
887
901
|
stackDest = stackDest || [];
|
888
902
|
|
889
903
|
if (isObject(source)) {
|
890
|
-
var index = stackSource.indexOf(source);
|
891
|
-
if (index !== -1) return stackDest[index];
|
892
|
-
|
893
904
|
stackSource.push(source);
|
894
905
|
stackDest.push(destination);
|
895
906
|
}
|
@@ -898,12 +909,7 @@ function copy(source, destination, stackSource, stackDest) {
|
|
898
909
|
if (isArray(source)) {
|
899
910
|
destination.length = 0;
|
900
911
|
for (var i = 0; i < source.length; i++) {
|
901
|
-
|
902
|
-
if (isObject(source[i])) {
|
903
|
-
stackSource.push(source[i]);
|
904
|
-
stackDest.push(result);
|
905
|
-
}
|
906
|
-
destination.push(result);
|
912
|
+
destination.push(copy(source[i], null, stackSource, stackDest));
|
907
913
|
}
|
908
914
|
} else {
|
909
915
|
var h = destination.$$hashKey;
|
@@ -917,20 +923,20 @@ function copy(source, destination, stackSource, stackDest) {
|
|
917
923
|
if (isBlankObject(source)) {
|
918
924
|
// createMap() fast path --- Safe to avoid hasOwnProperty check because prototype chain is empty
|
919
925
|
for (key in source) {
|
920
|
-
|
926
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
921
927
|
}
|
922
928
|
} else if (source && typeof source.hasOwnProperty === 'function') {
|
923
929
|
// Slow path, which must rely on hasOwnProperty
|
924
930
|
for (key in source) {
|
925
931
|
if (source.hasOwnProperty(key)) {
|
926
|
-
|
932
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
927
933
|
}
|
928
934
|
}
|
929
935
|
} else {
|
930
936
|
// Slowest path --- hasOwnProperty can't be called as a method
|
931
937
|
for (key in source) {
|
932
938
|
if (hasOwnProperty.call(source, key)) {
|
933
|
-
|
939
|
+
destination[key] = copy(source[key], null, stackSource, stackDest);
|
934
940
|
}
|
935
941
|
}
|
936
942
|
}
|
@@ -938,16 +944,6 @@ function copy(source, destination, stackSource, stackDest) {
|
|
938
944
|
}
|
939
945
|
}
|
940
946
|
return destination;
|
941
|
-
|
942
|
-
function putValue(key, val, destination, stackSource, stackDest) {
|
943
|
-
// No context allocation, trivial outer scope, easily inlined
|
944
|
-
var result = copy(val, null, stackSource, stackDest);
|
945
|
-
if (isObject(val)) {
|
946
|
-
stackSource.push(val);
|
947
|
-
stackDest.push(result);
|
948
|
-
}
|
949
|
-
destination[key] = result;
|
950
|
-
}
|
951
947
|
}
|
952
948
|
|
953
949
|
/**
|
@@ -2005,7 +2001,7 @@ function setupModuleLoader(window) {
|
|
2005
2001
|
* @description
|
2006
2002
|
* See {@link auto.$provide#provider $provide.provider()}.
|
2007
2003
|
*/
|
2008
|
-
provider:
|
2004
|
+
provider: invokeLaterAndSetModuleName('$provide', 'provider'),
|
2009
2005
|
|
2010
2006
|
/**
|
2011
2007
|
* @ngdoc method
|
@@ -2016,7 +2012,7 @@ function setupModuleLoader(window) {
|
|
2016
2012
|
* @description
|
2017
2013
|
* See {@link auto.$provide#factory $provide.factory()}.
|
2018
2014
|
*/
|
2019
|
-
factory:
|
2015
|
+
factory: invokeLaterAndSetModuleName('$provide', 'factory'),
|
2020
2016
|
|
2021
2017
|
/**
|
2022
2018
|
* @ngdoc method
|
@@ -2027,7 +2023,7 @@ function setupModuleLoader(window) {
|
|
2027
2023
|
* @description
|
2028
2024
|
* See {@link auto.$provide#service $provide.service()}.
|
2029
2025
|
*/
|
2030
|
-
service:
|
2026
|
+
service: invokeLaterAndSetModuleName('$provide', 'service'),
|
2031
2027
|
|
2032
2028
|
/**
|
2033
2029
|
* @ngdoc method
|
@@ -2062,7 +2058,7 @@ function setupModuleLoader(window) {
|
|
2062
2058
|
* @description
|
2063
2059
|
* See {@link auto.$provide#decorator $provide.decorator()}.
|
2064
2060
|
*/
|
2065
|
-
decorator:
|
2061
|
+
decorator: invokeLaterAndSetModuleName('$provide', 'decorator'),
|
2066
2062
|
|
2067
2063
|
/**
|
2068
2064
|
* @ngdoc method
|
@@ -2096,7 +2092,7 @@ function setupModuleLoader(window) {
|
|
2096
2092
|
* See {@link ng.$animateProvider#register $animateProvider.register()} and
|
2097
2093
|
* {@link ngAnimate ngAnimate module} for more information.
|
2098
2094
|
*/
|
2099
|
-
animation:
|
2095
|
+
animation: invokeLaterAndSetModuleName('$animateProvider', 'register'),
|
2100
2096
|
|
2101
2097
|
/**
|
2102
2098
|
* @ngdoc method
|
@@ -2114,7 +2110,7 @@ function setupModuleLoader(window) {
|
|
2114
2110
|
* (`myapp_subsection_filterx`).
|
2115
2111
|
* </div>
|
2116
2112
|
*/
|
2117
|
-
filter:
|
2113
|
+
filter: invokeLaterAndSetModuleName('$filterProvider', 'register'),
|
2118
2114
|
|
2119
2115
|
/**
|
2120
2116
|
* @ngdoc method
|
@@ -2126,7 +2122,7 @@ function setupModuleLoader(window) {
|
|
2126
2122
|
* @description
|
2127
2123
|
* See {@link ng.$controllerProvider#register $controllerProvider.register()}.
|
2128
2124
|
*/
|
2129
|
-
controller:
|
2125
|
+
controller: invokeLaterAndSetModuleName('$controllerProvider', 'register'),
|
2130
2126
|
|
2131
2127
|
/**
|
2132
2128
|
* @ngdoc method
|
@@ -2139,7 +2135,7 @@ function setupModuleLoader(window) {
|
|
2139
2135
|
* @description
|
2140
2136
|
* See {@link ng.$compileProvider#directive $compileProvider.directive()}.
|
2141
2137
|
*/
|
2142
|
-
directive:
|
2138
|
+
directive: invokeLaterAndSetModuleName('$compileProvider', 'directive'),
|
2143
2139
|
|
2144
2140
|
/**
|
2145
2141
|
* @ngdoc method
|
@@ -2189,6 +2185,19 @@ function setupModuleLoader(window) {
|
|
2189
2185
|
return moduleInstance;
|
2190
2186
|
};
|
2191
2187
|
}
|
2188
|
+
|
2189
|
+
/**
|
2190
|
+
* @param {string} provider
|
2191
|
+
* @param {string} method
|
2192
|
+
* @returns {angular.Module}
|
2193
|
+
*/
|
2194
|
+
function invokeLaterAndSetModuleName(provider, method) {
|
2195
|
+
return function(recipeName, factoryFunction) {
|
2196
|
+
if (factoryFunction && isFunction(factoryFunction)) factoryFunction.$$moduleName = name;
|
2197
|
+
invokeQueue.push([provider, method, arguments]);
|
2198
|
+
return moduleInstance;
|
2199
|
+
};
|
2200
|
+
}
|
2192
2201
|
});
|
2193
2202
|
};
|
2194
2203
|
});
|
@@ -2332,11 +2341,11 @@ function toDebugString(obj) {
|
|
2332
2341
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2333
2342
|
*/
|
2334
2343
|
var version = {
|
2335
|
-
full: '1.4.
|
2344
|
+
full: '1.4.1', // all of these placeholder strings will be replaced by grunt's
|
2336
2345
|
major: 1, // package task
|
2337
2346
|
minor: 4,
|
2338
|
-
dot:
|
2339
|
-
codeName: '
|
2347
|
+
dot: 1,
|
2348
|
+
codeName: 'hyperionic-illumination'
|
2340
2349
|
};
|
2341
2350
|
|
2342
2351
|
|
@@ -2662,6 +2671,13 @@ function jqLiteAcceptsData(node) {
|
|
2662
2671
|
return nodeType === NODE_TYPE_ELEMENT || !nodeType || nodeType === NODE_TYPE_DOCUMENT;
|
2663
2672
|
}
|
2664
2673
|
|
2674
|
+
function jqLiteHasData(node) {
|
2675
|
+
for (var key in jqCache[node.ng339]) {
|
2676
|
+
return true;
|
2677
|
+
}
|
2678
|
+
return false;
|
2679
|
+
}
|
2680
|
+
|
2665
2681
|
function jqLiteBuildFragment(html, context) {
|
2666
2682
|
var tmp, tag, wrap,
|
2667
2683
|
fragment = context.createDocumentFragment(),
|
@@ -3036,7 +3052,8 @@ function getAliasedAttrName(element, name) {
|
|
3036
3052
|
|
3037
3053
|
forEach({
|
3038
3054
|
data: jqLiteData,
|
3039
|
-
removeData: jqLiteRemoveData
|
3055
|
+
removeData: jqLiteRemoveData,
|
3056
|
+
hasData: jqLiteHasData
|
3040
3057
|
}, function(fn, name) {
|
3041
3058
|
JQLite[name] = fn;
|
3042
3059
|
});
|
@@ -4245,7 +4262,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
4245
4262
|
}));
|
4246
4263
|
|
4247
4264
|
|
4248
|
-
forEach(loadModules(modulesToLoad), function(fn) { instanceInjector.invoke(fn
|
4265
|
+
forEach(loadModules(modulesToLoad), function(fn) { if (fn) instanceInjector.invoke(fn); });
|
4249
4266
|
|
4250
4267
|
return instanceInjector;
|
4251
4268
|
|
@@ -5468,7 +5485,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
5468
5485
|
// Do the assignment again so that those two variables are referentially identical.
|
5469
5486
|
lastHistoryState = cachedState;
|
5470
5487
|
} else {
|
5471
|
-
if (!sameBase) {
|
5488
|
+
if (!sameBase || reloadLocation) {
|
5472
5489
|
reloadLocation = url;
|
5473
5490
|
}
|
5474
5491
|
if (replace) {
|
@@ -6474,13 +6491,16 @@ function $TemplateCacheProvider() {
|
|
6474
6491
|
* * `controller` - the directive's required controller instance(s) - Instances are shared
|
6475
6492
|
* among all directives, which allows the directives to use the controllers as a communication
|
6476
6493
|
* channel. The exact value depends on the directive's `require` property:
|
6494
|
+
* * no controller(s) required: the directive's own controller, or `undefined` if it doesn't have one
|
6477
6495
|
* * `string`: the controller instance
|
6478
6496
|
* * `array`: array of controller instances
|
6479
|
-
* * no controller(s) required: `undefined`
|
6480
6497
|
*
|
6481
6498
|
* If a required controller cannot be found, and it is optional, the instance is `null`,
|
6482
6499
|
* otherwise the {@link error:$compile:ctreq Missing Required Controller} error is thrown.
|
6483
6500
|
*
|
6501
|
+
* Note that you can also require the directive's own controller - it will be made available like
|
6502
|
+
* like any other controller.
|
6503
|
+
*
|
6484
6504
|
* * `transcludeFn` - A transclude linking function pre-bound to the correct transclusion scope.
|
6485
6505
|
* This is the same as the `$transclude`
|
6486
6506
|
* parameter of directive controllers, see there for details.
|
@@ -6927,6 +6947,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6927
6947
|
if (isObject(bindings.isolateScope)) {
|
6928
6948
|
directive.$$isolateBindings = bindings.isolateScope;
|
6929
6949
|
}
|
6950
|
+
directive.$$moduleName = directiveFactory.$$moduleName;
|
6930
6951
|
directives.push(directive);
|
6931
6952
|
} catch (e) {
|
6932
6953
|
$exceptionHandler(e);
|
@@ -7498,8 +7519,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7498
7519
|
|
7499
7520
|
if (nodeLinkFn.transcludeOnThisElement) {
|
7500
7521
|
childBoundTranscludeFn = createBoundTranscludeFn(
|
7501
|
-
scope, nodeLinkFn.transclude, parentBoundTranscludeFn
|
7502
|
-
nodeLinkFn.elementTranscludeOnThisElement);
|
7522
|
+
scope, nodeLinkFn.transclude, parentBoundTranscludeFn);
|
7503
7523
|
|
7504
7524
|
} else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {
|
7505
7525
|
childBoundTranscludeFn = parentBoundTranscludeFn;
|
@@ -7521,7 +7541,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7521
7541
|
}
|
7522
7542
|
}
|
7523
7543
|
|
7524
|
-
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn
|
7544
|
+
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {
|
7525
7545
|
|
7526
7546
|
var boundTranscludeFn = function(transcludedScope, cloneFn, controllers, futureParentElement, containingScope) {
|
7527
7547
|
|
@@ -7620,6 +7640,13 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7620
7640
|
}
|
7621
7641
|
break;
|
7622
7642
|
case NODE_TYPE_TEXT: /* Text Node */
|
7643
|
+
if (msie === 11) {
|
7644
|
+
// Workaround for #11781
|
7645
|
+
while (node.parentNode && node.nextSibling && node.nextSibling.nodeType === NODE_TYPE_TEXT) {
|
7646
|
+
node.nodeValue = node.nodeValue + node.nextSibling.nodeValue;
|
7647
|
+
node.parentNode.removeChild(node.nextSibling);
|
7648
|
+
}
|
7649
|
+
}
|
7623
7650
|
addTextInterpolateDirective(directives, node.nodeValue);
|
7624
7651
|
break;
|
7625
7652
|
case NODE_TYPE_COMMENT: /* Comment */
|
@@ -7912,7 +7939,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
7912
7939
|
|
7913
7940
|
nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
|
7914
7941
|
nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;
|
7915
|
-
nodeLinkFn.elementTranscludeOnThisElement = hasElementTranscludeDirective;
|
7916
7942
|
nodeLinkFn.templateOnThisElement = hasTemplate;
|
7917
7943
|
nodeLinkFn.transclude = childTranscludeFn;
|
7918
7944
|
|
@@ -8073,9 +8099,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8073
8099
|
for (i in elementControllers) {
|
8074
8100
|
controller = elementControllers[i];
|
8075
8101
|
var controllerResult = controller();
|
8102
|
+
|
8076
8103
|
if (controllerResult !== controller.instance) {
|
8104
|
+
// If the controller constructor has a return value, overwrite the instance
|
8105
|
+
// from setupControllers and update the element data
|
8077
8106
|
controller.instance = controllerResult;
|
8078
|
-
$element.data('$' +
|
8107
|
+
$element.data('$' + i + 'Controller', controllerResult);
|
8079
8108
|
if (controller === controllerForBindings) {
|
8080
8109
|
// Remove and re-install bindToController bindings
|
8081
8110
|
thisLinkFn.$$destroyBindings();
|
@@ -8375,11 +8404,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8375
8404
|
return a.index - b.index;
|
8376
8405
|
}
|
8377
8406
|
|
8378
|
-
|
8379
8407
|
function assertNoDuplicate(what, previousDirective, directive, element) {
|
8408
|
+
|
8409
|
+
function wrapModuleNameIfDefined(moduleName) {
|
8410
|
+
return moduleName ?
|
8411
|
+
(' (module: ' + moduleName + ')') :
|
8412
|
+
'';
|
8413
|
+
}
|
8414
|
+
|
8380
8415
|
if (previousDirective) {
|
8381
|
-
throw $compileMinErr('multidir', 'Multiple directives [{0}, {
|
8382
|
-
previousDirective.name,
|
8416
|
+
throw $compileMinErr('multidir', 'Multiple directives [{0}{1}, {2}{3}] asking for {4} on: {5}',
|
8417
|
+
previousDirective.name, wrapModuleNameIfDefined(previousDirective.$$moduleName),
|
8418
|
+
directive.name, wrapModuleNameIfDefined(directive.$$moduleName), what, startingTag(element));
|
8383
8419
|
}
|
8384
8420
|
}
|
8385
8421
|
|
@@ -8560,26 +8596,28 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8560
8596
|
var fragment = document.createDocumentFragment();
|
8561
8597
|
fragment.appendChild(firstElementToRemove);
|
8562
8598
|
|
8563
|
-
|
8564
|
-
|
8565
|
-
|
8566
|
-
|
8567
|
-
|
8568
|
-
|
8569
|
-
|
8570
|
-
|
8571
|
-
|
8572
|
-
|
8573
|
-
|
8574
|
-
|
8575
|
-
|
8576
|
-
|
8577
|
-
|
8578
|
-
|
8579
|
-
|
8580
|
-
|
8581
|
-
|
8582
|
-
|
8599
|
+
if (jqLite.hasData(firstElementToRemove)) {
|
8600
|
+
// Copy over user data (that includes Angular's $scope etc.). Don't copy private
|
8601
|
+
// data here because there's no public interface in jQuery to do that and copying over
|
8602
|
+
// event listeners (which is the main use of private data) wouldn't work anyway.
|
8603
|
+
jqLite(newNode).data(jqLite(firstElementToRemove).data());
|
8604
|
+
|
8605
|
+
// Remove data of the replaced element. We cannot just call .remove()
|
8606
|
+
// on the element it since that would deallocate scope that is needed
|
8607
|
+
// for the new node. Instead, remove the data "manually".
|
8608
|
+
if (!jQuery) {
|
8609
|
+
delete jqLite.cache[firstElementToRemove[jqLite.expando]];
|
8610
|
+
} else {
|
8611
|
+
// jQuery 2.x doesn't expose the data storage. Use jQuery.cleanData to clean up after
|
8612
|
+
// the replaced element. The cleanData version monkey-patched by Angular would cause
|
8613
|
+
// the scope to be trashed and we do need the very same scope to work with the new
|
8614
|
+
// element. However, we cannot just cache the non-patched version and use it here as
|
8615
|
+
// that would break if another library patches the method after Angular does (one
|
8616
|
+
// example is jQuery UI). Instead, set a flag indicating scope destroying should be
|
8617
|
+
// skipped this one time.
|
8618
|
+
skipDestroyOnNextJQueryCleanData = true;
|
8619
|
+
jQuery.cleanData([firstElementToRemove]);
|
8620
|
+
}
|
8583
8621
|
}
|
8584
8622
|
|
8585
8623
|
for (var k = 1, kk = elementsToRemove.length; k < kk; k++) {
|
@@ -8620,9 +8658,19 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8620
8658
|
lastValue,
|
8621
8659
|
parentGet, parentSet, compare;
|
8622
8660
|
|
8661
|
+
if (!hasOwnProperty.call(attrs, attrName)) {
|
8662
|
+
// In the case of user defined a binding with the same name as a method in Object.prototype but didn't set
|
8663
|
+
// the corresponding attribute. We need to make sure subsequent code won't access to the prototype function
|
8664
|
+
attrs[attrName] = undefined;
|
8665
|
+
}
|
8666
|
+
|
8623
8667
|
switch (mode) {
|
8624
8668
|
|
8625
8669
|
case '@':
|
8670
|
+
if (!attrs[attrName] && !optional) {
|
8671
|
+
destination[scopeName] = undefined;
|
8672
|
+
}
|
8673
|
+
|
8626
8674
|
attrs.$observe(attrName, function(value) {
|
8627
8675
|
destination[scopeName] = value;
|
8628
8676
|
});
|
@@ -8639,6 +8687,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8639
8687
|
return;
|
8640
8688
|
}
|
8641
8689
|
parentGet = $parse(attrs[attrName]);
|
8690
|
+
|
8642
8691
|
if (parentGet.literal) {
|
8643
8692
|
compare = equals;
|
8644
8693
|
} else {
|
@@ -8677,9 +8726,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
8677
8726
|
break;
|
8678
8727
|
|
8679
8728
|
case '&':
|
8680
|
-
// Don't assign Object.prototype method to scope
|
8681
|
-
if (!attrs.hasOwnProperty(attrName) && optional) break;
|
8682
|
-
|
8683
8729
|
parentGet = $parse(attrs[attrName]);
|
8684
8730
|
|
8685
8731
|
// Don't assign noop to destination if expression is not valid
|
@@ -9080,13 +9126,17 @@ function $HttpParamSerializerProvider() {
|
|
9080
9126
|
* @name $httpParamSerializer
|
9081
9127
|
* @description
|
9082
9128
|
*
|
9083
|
-
* Default $http params serializer that converts objects to
|
9129
|
+
* Default {@link $http `$http`} params serializer that converts objects to strings
|
9084
9130
|
* according to the following rules:
|
9131
|
+
*
|
9085
9132
|
* * `{'foo': 'bar'}` results in `foo=bar`
|
9086
9133
|
* * `{'foo': Date.now()}` results in `foo=2015-04-01T09%3A50%3A49.262Z` (`toISOString()` and encoded representation of a Date object)
|
9087
9134
|
* * `{'foo': ['bar', 'baz']}` results in `foo=bar&foo=baz` (repeated key for each array element)
|
9088
9135
|
* * `{'foo': {'bar':'baz'}}` results in `foo=%7B%22bar%22%3A%22baz%22%7D"` (stringified and encoded representation of an object)
|
9136
|
+
*
|
9137
|
+
* Note that serializer will sort the request parameters alphabetically.
|
9089
9138
|
* */
|
9139
|
+
|
9090
9140
|
this.$get = function() {
|
9091
9141
|
return function ngParamSerializer(params) {
|
9092
9142
|
if (!params) return '';
|
@@ -9113,7 +9163,43 @@ function $HttpParamSerializerJQLikeProvider() {
|
|
9113
9163
|
* @name $httpParamSerializerJQLike
|
9114
9164
|
* @description
|
9115
9165
|
*
|
9116
|
-
* Alternative $http params serializer that follows
|
9166
|
+
* Alternative {@link $http `$http`} params serializer that follows
|
9167
|
+
* jQuery's [`param()`](http://api.jquery.com/jquery.param/) method logic.
|
9168
|
+
* The serializer will also sort the params alphabetically.
|
9169
|
+
*
|
9170
|
+
* To use it for serializing `$http` request parameters, set it as the `paramSerializer` property:
|
9171
|
+
*
|
9172
|
+
* ```js
|
9173
|
+
* $http({
|
9174
|
+
* url: myUrl,
|
9175
|
+
* method: 'GET',
|
9176
|
+
* params: myParams,
|
9177
|
+
* paramSerializer: '$httpParamSerializerJQLike'
|
9178
|
+
* });
|
9179
|
+
* ```
|
9180
|
+
*
|
9181
|
+
* It is also possible to set it as the default `paramSerializer` in the
|
9182
|
+
* {@link $httpProvider#defaults `$httpProvider`}.
|
9183
|
+
*
|
9184
|
+
* Additionally, you can inject the serializer and use it explicitly, for example to serialize
|
9185
|
+
* form data for submission:
|
9186
|
+
*
|
9187
|
+
* ```js
|
9188
|
+
* .controller(function($http, $httpParamSerializerJQLike) {
|
9189
|
+
* //...
|
9190
|
+
*
|
9191
|
+
* $http({
|
9192
|
+
* url: myUrl,
|
9193
|
+
* method: 'POST',
|
9194
|
+
* data: $httpParamSerializerJQLike(myData),
|
9195
|
+
* headers: {
|
9196
|
+
* 'Content-Type': 'application/x-www-form-urlencoded'
|
9197
|
+
* }
|
9198
|
+
* });
|
9199
|
+
*
|
9200
|
+
* });
|
9201
|
+
* ```
|
9202
|
+
*
|
9117
9203
|
* */
|
9118
9204
|
this.$get = function() {
|
9119
9205
|
return function jQueryLikeParamSerializer(params) {
|
@@ -9287,10 +9373,11 @@ function $HttpProvider() {
|
|
9287
9373
|
* - **`defaults.headers.put`**
|
9288
9374
|
* - **`defaults.headers.patch`**
|
9289
9375
|
*
|
9290
|
-
*
|
9291
|
-
*
|
9292
|
-
*
|
9293
|
-
*
|
9376
|
+
*
|
9377
|
+
* - **`defaults.paramSerializer`** - `{string|function(Object<string,string>):string}` - A function
|
9378
|
+
* used to the prepare string representation of request parameters (specified as an object).
|
9379
|
+
* If specified as string, it is interpreted as a function registered with the {@link auto.$injector $injector}.
|
9380
|
+
* Defaults to {@link ng.$httpParamSerializer $httpParamSerializer}.
|
9294
9381
|
*
|
9295
9382
|
**/
|
9296
9383
|
var defaults = this.defaults = {
|
@@ -9756,15 +9843,17 @@ function $HttpProvider() {
|
|
9756
9843
|
* properties of either $httpProvider.defaults at config-time, $http.defaults at run-time,
|
9757
9844
|
* or the per-request config object.
|
9758
9845
|
*
|
9846
|
+
* In order to prevent collisions in environments where multiple Angular apps share the
|
9847
|
+
* same domain or subdomain, we recommend that each application uses unique cookie name.
|
9848
|
+
*
|
9759
9849
|
*
|
9760
9850
|
* @param {object} config Object describing the request to be made and how it should be
|
9761
9851
|
* processed. The object has following properties:
|
9762
9852
|
*
|
9763
9853
|
* - **method** – `{string}` – HTTP method (e.g. 'GET', 'POST', etc)
|
9764
9854
|
* - **url** – `{string}` – Absolute or relative URL of the resource that is being requested.
|
9765
|
-
* - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be
|
9766
|
-
*
|
9767
|
-
* JSONified.
|
9855
|
+
* - **params** – `{Object.<string|Object>}` – Map of strings or objects which will be serialized
|
9856
|
+
* with the `paramSerializer` and appended as GET parameters.
|
9768
9857
|
* - **data** – `{string|Object}` – Data to be sent as the request message data.
|
9769
9858
|
* - **headers** – `{Object}` – Map of strings or functions which return strings representing
|
9770
9859
|
* HTTP headers to send to the server. If the return value of a function is null, the
|
@@ -9782,10 +9871,14 @@ function $HttpProvider() {
|
|
9782
9871
|
* transform function or an array of such functions. The transform function takes the http
|
9783
9872
|
* response body, headers and status and returns its transformed (typically deserialized) version.
|
9784
9873
|
* See {@link ng.$http#overriding-the-default-transformations-per-request
|
9785
|
-
* Overriding the Default
|
9786
|
-
* - **paramSerializer** - {string|function(Object<string,string>):string} - A function used to
|
9787
|
-
* of request parameters (specified as an object).
|
9788
|
-
*
|
9874
|
+
* Overriding the Default TransformationjqLiks}
|
9875
|
+
* - **paramSerializer** - `{string|function(Object<string,string>):string}` - A function used to
|
9876
|
+
* prepare the string representation of request parameters (specified as an object).
|
9877
|
+
* If specified as string, it is interpreted as function registered with the
|
9878
|
+
* {@link $injector $injector}, which means you can create your own serializer
|
9879
|
+
* by registering it as a {@link auto.$provide#service service}.
|
9880
|
+
* The default serializer is the {@link $httpParamSerializer $httpParamSerializer};
|
9881
|
+
* alternatively, you can use the {@link $httpParamSerializerJQLike $httpParamSerializerJQLike}
|
9789
9882
|
* - **cache** – `{boolean|Cache}` – If true, a default $http cache will be used to cache the
|
9790
9883
|
* GET request, otherwise if a cache instance built with
|
9791
9884
|
* {@link ng.$cacheFactory $cacheFactory}, this cache will be used for
|
@@ -13213,8 +13306,10 @@ ASTCompiler.prototype = {
|
|
13213
13306
|
nameId.name = ast.property.name;
|
13214
13307
|
}
|
13215
13308
|
}
|
13216
|
-
|
13309
|
+
}, function() {
|
13310
|
+
self.assign(intoId, 'undefined');
|
13217
13311
|
});
|
13312
|
+
recursionFn(intoId);
|
13218
13313
|
}, !!create);
|
13219
13314
|
break;
|
13220
13315
|
case AST.CallExpression:
|
@@ -13252,8 +13347,10 @@ ASTCompiler.prototype = {
|
|
13252
13347
|
}
|
13253
13348
|
expression = self.ensureSafeObject(expression);
|
13254
13349
|
self.assign(intoId, expression);
|
13255
|
-
|
13350
|
+
}, function() {
|
13351
|
+
self.assign(intoId, 'undefined');
|
13256
13352
|
});
|
13353
|
+
recursionFn(intoId);
|
13257
13354
|
});
|
13258
13355
|
}
|
13259
13356
|
break;
|
@@ -14634,6 +14731,19 @@ function qFactory(nextTick, exceptionHandler) {
|
|
14634
14731
|
return result.promise.then(callback, errback, progressBack);
|
14635
14732
|
};
|
14636
14733
|
|
14734
|
+
/**
|
14735
|
+
* @ngdoc method
|
14736
|
+
* @name $q#resolve
|
14737
|
+
* @kind function
|
14738
|
+
*
|
14739
|
+
* @description
|
14740
|
+
* Alias of {@link ng.$q#when when} to maintain naming consistency with ES6.
|
14741
|
+
*
|
14742
|
+
* @param {*} value Value or a promise
|
14743
|
+
* @returns {Promise} Returns a promise of the passed value or promise
|
14744
|
+
*/
|
14745
|
+
var resolve = when;
|
14746
|
+
|
14637
14747
|
/**
|
14638
14748
|
* @ngdoc method
|
14639
14749
|
* @name $q#all
|
@@ -14702,6 +14812,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
14702
14812
|
$Q.defer = defer;
|
14703
14813
|
$Q.reject = reject;
|
14704
14814
|
$Q.when = when;
|
14815
|
+
$Q.resolve = resolve;
|
14705
14816
|
$Q.all = all;
|
14706
14817
|
|
14707
14818
|
return $Q;
|
@@ -18011,9 +18122,11 @@ function $FilterProvider($provide) {
|
|
18011
18122
|
* `{name: {first: 'John', last: 'Doe'}}` will **not** be matched by `{name: 'John'}`, but
|
18012
18123
|
* **will** be matched by `{$: 'John'}`.
|
18013
18124
|
*
|
18014
|
-
* - `function(value, index)`: A predicate function can be used to write arbitrary filters.
|
18015
|
-
* function is called for each element of
|
18016
|
-
*
|
18125
|
+
* - `function(value, index, array)`: A predicate function can be used to write arbitrary filters.
|
18126
|
+
* The function is called for each element of the array, with the element, its index, and
|
18127
|
+
* the entire array itself as arguments.
|
18128
|
+
*
|
18129
|
+
* The final result is an array of those elements that the predicate returned true for.
|
18017
18130
|
*
|
18018
18131
|
* @param {function(actual, expected)|true|undefined} comparator Comparator which is used in
|
18019
18132
|
* determining if the expected value (from the filter expression) and actual value (from
|
@@ -18314,9 +18427,10 @@ function currencyFilter($locale) {
|
|
18314
18427
|
* @description
|
18315
18428
|
* Formats a number as text.
|
18316
18429
|
*
|
18430
|
+
* If the input is null or undefined, it will just be returned.
|
18431
|
+
* If the input is infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned.
|
18317
18432
|
* If the input is not a number an empty string is returned.
|
18318
18433
|
*
|
18319
|
-
* If the input is an infinite (Infinity/-Infinity) the Infinity symbol '∞' is returned.
|
18320
18434
|
*
|
18321
18435
|
* @param {number|string} number Number to format.
|
18322
18436
|
* @param {(number|string)=} fractionSize Number of decimal places to round the number to.
|
@@ -18945,7 +19059,7 @@ function limitToFilter() {
|
|
18945
19059
|
* @description
|
18946
19060
|
* Orders a specified `array` by the `expression` predicate. It is ordered alphabetically
|
18947
19061
|
* for strings and numerically for numbers. Note: if you notice numbers are not being sorted
|
18948
|
-
*
|
19062
|
+
* as expected, make sure they are actually being saved as numbers and not strings.
|
18949
19063
|
*
|
18950
19064
|
* @param {Array} array The array to sort.
|
18951
19065
|
* @param {function(*)|string|Array.<(function(*)|string)>=} expression A predicate to be
|
@@ -19020,19 +19134,40 @@ function limitToFilter() {
|
|
19020
19134
|
{name:'Mike', phone:'555-4321', age:21},
|
19021
19135
|
{name:'Adam', phone:'555-5678', age:35},
|
19022
19136
|
{name:'Julie', phone:'555-8765', age:29}];
|
19023
|
-
$scope.predicate = '
|
19137
|
+
$scope.predicate = 'age';
|
19138
|
+
$scope.reverse = true;
|
19139
|
+
$scope.order = function(predicate) {
|
19140
|
+
$scope.reverse = ($scope.predicate === predicate) ? !$scope.reverse : false;
|
19141
|
+
$scope.predicate = predicate;
|
19142
|
+
};
|
19024
19143
|
}]);
|
19025
19144
|
</script>
|
19145
|
+
<style type="text/css">
|
19146
|
+
.sortorder:after {
|
19147
|
+
content: '\25b2';
|
19148
|
+
}
|
19149
|
+
.sortorder.reverse:after {
|
19150
|
+
content: '\25bc';
|
19151
|
+
}
|
19152
|
+
</style>
|
19026
19153
|
<div ng-controller="ExampleController">
|
19027
19154
|
<pre>Sorting predicate = {{predicate}}; reverse = {{reverse}}</pre>
|
19028
19155
|
<hr/>
|
19029
19156
|
[ <a href="" ng-click="predicate=''">unsorted</a> ]
|
19030
19157
|
<table class="friend">
|
19031
19158
|
<tr>
|
19032
|
-
<th
|
19033
|
-
|
19034
|
-
|
19035
|
-
|
19159
|
+
<th>
|
19160
|
+
<a href="" ng-click="order('name')">Name</a>
|
19161
|
+
<span class="sortorder" ng-show="predicate === 'name'" ng-class="{reverse:reverse}"></span>
|
19162
|
+
</th>
|
19163
|
+
<th>
|
19164
|
+
<a href="" ng-click="order('phone')">Phone Number</a>
|
19165
|
+
<span class="sortorder" ng-show="predicate === 'phone'" ng-class="{reverse:reverse}"></span>
|
19166
|
+
</th>
|
19167
|
+
<th>
|
19168
|
+
<a href="" ng-click="order('age')">Age</a>
|
19169
|
+
<span class="sortorder" ng-show="predicate === 'age'" ng-class="{reverse:reverse}"></span>
|
19170
|
+
</th>
|
19036
19171
|
</tr>
|
19037
19172
|
<tr ng-repeat="friend in friends | orderBy:predicate:reverse">
|
19038
19173
|
<td>{{friend.name}}</td>
|
@@ -20195,7 +20330,7 @@ var ngFormDirective = formDirectiveFactory(true);
|
|
20195
20330
|
var ISO_DATE_REGEXP = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/;
|
20196
20331
|
var URL_REGEXP = /^(ftp|http|https):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?$/;
|
20197
20332
|
var EMAIL_REGEXP = /^[a-z0-9!#$%&'*+\/=?^_`{|}~.-]+@[a-z0-9]([a-z0-9-]*[a-z0-9])?(\.[a-z0-9]([a-z0-9-]*[a-z0-9])?)*$/i;
|
20198
|
-
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))
|
20333
|
+
var NUMBER_REGEXP = /^\s*(\-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/;
|
20199
20334
|
var DATE_REGEXP = /^(\d{4})-(\d{2})-(\d{2})$/;
|
20200
20335
|
var DATETIMELOCAL_REGEXP = /^(\d{4})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/;
|
20201
20336
|
var WEEK_REGEXP = /^(\d{4})-W(\d\d)$/;
|
@@ -20794,6 +20929,16 @@ var inputType = {
|
|
20794
20929
|
* error docs for more information and an example of how to convert your model if necessary.
|
20795
20930
|
* </div>
|
20796
20931
|
*
|
20932
|
+
* ## Issues with HTML5 constraint validation
|
20933
|
+
*
|
20934
|
+
* In browsers that follow the
|
20935
|
+
* [HTML5 specification](https://html.spec.whatwg.org/multipage/forms.html#number-state-%28type=number%29),
|
20936
|
+
* `input[number]` does not work as expected with {@link ngModelOptions `ngModelOptions.allowInvalid`}.
|
20937
|
+
* If a non-number is entered in the input, the browser will report the value as an empty string,
|
20938
|
+
* which means the view / model values in `ngModel` and subsequently the scope value
|
20939
|
+
* will also be an empty string.
|
20940
|
+
*
|
20941
|
+
*
|
20797
20942
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
20798
20943
|
* @param {string=} name Property name of the form under which the control is published.
|
20799
20944
|
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
@@ -22330,7 +22475,7 @@ function classDirective(name, selector) {
|
|
22330
22475
|
* @example Example that demonstrates basic bindings via ngClass directive.
|
22331
22476
|
<example>
|
22332
22477
|
<file name="index.html">
|
22333
|
-
<p ng-class="{strike: deleted, bold: important,
|
22478
|
+
<p ng-class="{strike: deleted, bold: important, 'has-error': error}">Map Syntax Example</p>
|
22334
22479
|
<label>
|
22335
22480
|
<input type="checkbox" ng-model="deleted">
|
22336
22481
|
deleted (apply "strike" class)
|
@@ -22341,7 +22486,7 @@ function classDirective(name, selector) {
|
|
22341
22486
|
</label><br>
|
22342
22487
|
<label>
|
22343
22488
|
<input type="checkbox" ng-model="error">
|
22344
|
-
error (apply "
|
22489
|
+
error (apply "has-error" class)
|
22345
22490
|
</label>
|
22346
22491
|
<hr>
|
22347
22492
|
<p ng-class="style">Using String Syntax</p>
|
@@ -22370,6 +22515,10 @@ function classDirective(name, selector) {
|
|
22370
22515
|
.red {
|
22371
22516
|
color: red;
|
22372
22517
|
}
|
22518
|
+
.has-error {
|
22519
|
+
color: red;
|
22520
|
+
background-color: yellow;
|
22521
|
+
}
|
22373
22522
|
.orange {
|
22374
22523
|
color: orange;
|
22375
22524
|
}
|
@@ -22380,13 +22529,13 @@ function classDirective(name, selector) {
|
|
22380
22529
|
it('should let you toggle the class', function() {
|
22381
22530
|
|
22382
22531
|
expect(ps.first().getAttribute('class')).not.toMatch(/bold/);
|
22383
|
-
expect(ps.first().getAttribute('class')).not.toMatch(/
|
22532
|
+
expect(ps.first().getAttribute('class')).not.toMatch(/has-error/);
|
22384
22533
|
|
22385
22534
|
element(by.model('important')).click();
|
22386
22535
|
expect(ps.first().getAttribute('class')).toMatch(/bold/);
|
22387
22536
|
|
22388
22537
|
element(by.model('error')).click();
|
22389
|
-
expect(ps.first().getAttribute('class')).toMatch(/
|
22538
|
+
expect(ps.first().getAttribute('class')).toMatch(/has-error/);
|
22390
22539
|
});
|
22391
22540
|
|
22392
22541
|
it('should let you toggle string example', function() {
|
@@ -25220,7 +25369,7 @@ var DEFAULT_REGEXP = /(\s+|^)default(\s+|$)/;
|
|
25220
25369
|
* - `debounce`: integer value which contains the debounce model update value in milliseconds. A
|
25221
25370
|
* value of 0 triggers an immediate update. If an object is supplied instead, you can specify a
|
25222
25371
|
* custom value for each event. For example:
|
25223
|
-
* `ng-model-options="{ updateOn: 'default blur', debounce: {'default': 500, 'blur': 0} }"`
|
25372
|
+
* `ng-model-options="{ updateOn: 'default blur', debounce: { 'default': 500, 'blur': 0 } }"`
|
25224
25373
|
* - `allowInvalid`: boolean value which indicates that the model can be set with values that did
|
25225
25374
|
* not validate correctly instead of the default behavior of setting the model to undefined.
|
25226
25375
|
* - `getterSetter`: boolean value which determines whether or not to treat functions bound to
|
@@ -25470,7 +25619,9 @@ function addSetValidityMethod(context) {
|
|
25470
25619
|
function isObjectEmpty(obj) {
|
25471
25620
|
if (obj) {
|
25472
25621
|
for (var prop in obj) {
|
25473
|
-
|
25622
|
+
if (obj.hasOwnProperty(prop)) {
|
25623
|
+
return false;
|
25624
|
+
}
|
25474
25625
|
}
|
25475
25626
|
}
|
25476
25627
|
return true;
|
@@ -25813,6 +25964,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
25813
25964
|
values = values || [];
|
25814
25965
|
|
25815
25966
|
Object.keys(values).forEach(function getWatchable(key) {
|
25967
|
+
if (key.charAt(0) === '$') return;
|
25816
25968
|
var locals = getLocals(values[key], key);
|
25817
25969
|
var selectValue = getTrackByValueFn(values[key], locals);
|
25818
25970
|
watchedArray.push(selectValue);
|
@@ -26216,8 +26368,7 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
26216
26368
|
// Check to see if the value has changed due to the update to the options
|
26217
26369
|
if (!ngModelCtrl.$isEmpty(previousValue)) {
|
26218
26370
|
var nextValue = selectCtrl.readValue();
|
26219
|
-
if (ngOptions.trackBy
|
26220
|
-
previousValue !== nextValue) {
|
26371
|
+
if (ngOptions.trackBy ? !equals(previousValue, nextValue) : previousValue !== nextValue) {
|
26221
26372
|
ngModelCtrl.$setViewValue(nextValue);
|
26222
26373
|
ngModelCtrl.$render();
|
26223
26374
|
}
|
@@ -26565,6 +26716,15 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
26565
26716
|
* </div>
|
26566
26717
|
* ```
|
26567
26718
|
*
|
26719
|
+
* <div class="alert alert-warning">
|
26720
|
+
* **Note:** `track by` must always be the last expression:
|
26721
|
+
* </div>
|
26722
|
+
* ```
|
26723
|
+
* <div ng-repeat="model in collection | orderBy: 'id' as filtered_result track by model.id">
|
26724
|
+
* {{model.name}}
|
26725
|
+
* </div>
|
26726
|
+
* ```
|
26727
|
+
*
|
26568
26728
|
* # Special repeat start and end points
|
26569
26729
|
* To repeat a series of elements instead of just one parent element, ngRepeat (as well as other ng directives) supports extending
|
26570
26730
|
* the range of the repeater by defining explicit start and end points by using **ng-repeat-start** and **ng-repeat-end** respectively.
|
@@ -26636,8 +26796,9 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
26636
26796
|
* which can be used to associate the objects in the collection with the DOM elements. If no tracking expression
|
26637
26797
|
* is specified, ng-repeat associates elements by identity. It is an error to have
|
26638
26798
|
* more than one tracking expression value resolve to the same key. (This would mean that two distinct objects are
|
26639
|
-
* mapped to the same DOM element, which is not possible.)
|
26640
|
-
*
|
26799
|
+
* mapped to the same DOM element, which is not possible.)
|
26800
|
+
*
|
26801
|
+
* Note that the tracking expression must come last, after any filters, and the alias expression.
|
26641
26802
|
*
|
26642
26803
|
* For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
|
26643
26804
|
* will be associated by item identity in the array.
|