angularjs-rails 1.4.4 → 1.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +266 -123
- data/vendor/assets/javascripts/angular-aria.js +40 -36
- data/vendor/assets/javascripts/angular-cookies.js +2 -2
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-message-format.js +1 -1
- data/vendor/assets/javascripts/angular-messages.js +9 -2
- data/vendor/assets/javascripts/angular-mocks.js +62 -25
- data/vendor/assets/javascripts/angular-resource.js +10 -4
- data/vendor/assets/javascripts/angular-route.js +1 -2
- data/vendor/assets/javascripts/angular-sanitize.js +1 -1
- data/vendor/assets/javascripts/angular-scenario.js +625 -325
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +624 -324
- data/vendor/assets/javascripts/unstable/angular2.js +13370 -14106
- metadata +2 -2
@@ -9190,7 +9190,7 @@ return jQuery;
|
|
9190
9190
|
}));
|
9191
9191
|
|
9192
9192
|
/**
|
9193
|
-
* @license AngularJS v1.4.
|
9193
|
+
* @license AngularJS v1.4.7
|
9194
9194
|
* (c) 2010-2015 Google, Inc. http://angularjs.org
|
9195
9195
|
* License: MIT
|
9196
9196
|
*/
|
@@ -9249,7 +9249,7 @@ function minErr(module, ErrorConstructor) {
|
|
9249
9249
|
return match;
|
9250
9250
|
});
|
9251
9251
|
|
9252
|
-
message += '\nhttp://errors.angularjs.org/1.4.
|
9252
|
+
message += '\nhttp://errors.angularjs.org/1.4.7/' +
|
9253
9253
|
(module ? module + '/' : '') + code;
|
9254
9254
|
|
9255
9255
|
for (i = SKIP_INDEXES, paramPrefix = '?'; i < templateArgs.length; i++, paramPrefix = '&') {
|
@@ -10086,6 +10086,8 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10086
10086
|
} else if (isRegExp(source)) {
|
10087
10087
|
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
|
10088
10088
|
destination.lastIndex = source.lastIndex;
|
10089
|
+
} else if (isFunction(source.cloneNode)) {
|
10090
|
+
destination = source.cloneNode(true);
|
10089
10091
|
} else {
|
10090
10092
|
var emptyObject = Object.create(getPrototypeOf(source));
|
10091
10093
|
return copy(source, emptyObject, stackSource, stackDest);
|
@@ -10236,7 +10238,7 @@ function equals(o1, o2) {
|
|
10236
10238
|
for (key in o2) {
|
10237
10239
|
if (!(key in keySet) &&
|
10238
10240
|
key.charAt(0) !== '$' &&
|
10239
|
-
o2[key]
|
10241
|
+
isDefined(o2[key]) &&
|
10240
10242
|
!isFunction(o2[key])) return false;
|
10241
10243
|
}
|
10242
10244
|
return true;
|
@@ -10932,10 +10934,9 @@ function bindJQuery() {
|
|
10932
10934
|
|
10933
10935
|
// bind to jQuery if present;
|
10934
10936
|
var jqName = jq();
|
10935
|
-
jQuery = window.jQuery
|
10936
|
-
|
10937
|
-
|
10938
|
-
}
|
10937
|
+
jQuery = isUndefined(jqName) ? window.jQuery : // use jQuery (if present)
|
10938
|
+
!jqName ? undefined : // use jqLite
|
10939
|
+
window[jqName]; // use jQuery specified by `ngJq`
|
10939
10940
|
|
10940
10941
|
// Use jQuery if it exists with proper functionality, otherwise default to us.
|
10941
10942
|
// Angular 1.2+ requires jQuery 1.7+ for on()/off() support.
|
@@ -11040,22 +11041,24 @@ function getter(obj, path, bindFnToScope) {
|
|
11040
11041
|
/**
|
11041
11042
|
* Return the DOM siblings between the first and last node in the given array.
|
11042
11043
|
* @param {Array} array like object
|
11043
|
-
* @returns {
|
11044
|
+
* @returns {Array} the inputted object or a jqLite collection containing the nodes
|
11044
11045
|
*/
|
11045
11046
|
function getBlockNodes(nodes) {
|
11046
|
-
// TODO(perf):
|
11047
|
-
// collection, otherwise update the original collection.
|
11047
|
+
// TODO(perf): update `nodes` instead of creating a new object?
|
11048
11048
|
var node = nodes[0];
|
11049
11049
|
var endNode = nodes[nodes.length - 1];
|
11050
|
-
var blockNodes
|
11050
|
+
var blockNodes;
|
11051
11051
|
|
11052
|
-
|
11053
|
-
|
11054
|
-
|
11055
|
-
|
11056
|
-
|
11052
|
+
for (var i = 1; node !== endNode && (node = node.nextSibling); i++) {
|
11053
|
+
if (blockNodes || nodes[i] !== node) {
|
11054
|
+
if (!blockNodes) {
|
11055
|
+
blockNodes = jqLite(slice.call(nodes, 0, i));
|
11056
|
+
}
|
11057
|
+
blockNodes.push(node);
|
11058
|
+
}
|
11059
|
+
}
|
11057
11060
|
|
11058
|
-
return
|
11061
|
+
return blockNodes || nodes;
|
11059
11062
|
}
|
11060
11063
|
|
11061
11064
|
|
@@ -11439,7 +11442,7 @@ function serializeObject(obj) {
|
|
11439
11442
|
val = toJsonReplacer(key, val);
|
11440
11443
|
if (isObject(val)) {
|
11441
11444
|
|
11442
|
-
if (seen.indexOf(val) >= 0) return '
|
11445
|
+
if (seen.indexOf(val) >= 0) return '...';
|
11443
11446
|
|
11444
11447
|
seen.push(val);
|
11445
11448
|
}
|
@@ -11450,7 +11453,7 @@ function serializeObject(obj) {
|
|
11450
11453
|
function toDebugString(obj) {
|
11451
11454
|
if (typeof obj === 'function') {
|
11452
11455
|
return obj.toString().replace(/ \{[\s\S]*$/, '');
|
11453
|
-
} else if (
|
11456
|
+
} else if (isUndefined(obj)) {
|
11454
11457
|
return 'undefined';
|
11455
11458
|
} else if (typeof obj !== 'string') {
|
11456
11459
|
return serializeObject(obj);
|
@@ -11530,6 +11533,7 @@ function toDebugString(obj) {
|
|
11530
11533
|
$HttpParamSerializerProvider,
|
11531
11534
|
$HttpParamSerializerJQLikeProvider,
|
11532
11535
|
$HttpBackendProvider,
|
11536
|
+
$xhrFactoryProvider,
|
11533
11537
|
$LocationProvider,
|
11534
11538
|
$LogProvider,
|
11535
11539
|
$ParseProvider,
|
@@ -11556,8 +11560,9 @@ function toDebugString(obj) {
|
|
11556
11560
|
* @name angular.version
|
11557
11561
|
* @module ng
|
11558
11562
|
* @description
|
11559
|
-
* An object that contains information about the current AngularJS version.
|
11560
|
-
*
|
11563
|
+
* An object that contains information about the current AngularJS version.
|
11564
|
+
*
|
11565
|
+
* This object has the following properties:
|
11561
11566
|
*
|
11562
11567
|
* - `full` – `{string}` – Full version string, such as "0.9.18".
|
11563
11568
|
* - `major` – `{number}` – Major version number, such as "0".
|
@@ -11566,11 +11571,11 @@ function toDebugString(obj) {
|
|
11566
11571
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11567
11572
|
*/
|
11568
11573
|
var version = {
|
11569
|
-
full: '1.4.
|
11574
|
+
full: '1.4.7', // all of these placeholder strings will be replaced by grunt's
|
11570
11575
|
major: 1, // package task
|
11571
11576
|
minor: 4,
|
11572
|
-
dot:
|
11573
|
-
codeName: '
|
11577
|
+
dot: 7,
|
11578
|
+
codeName: 'dark-luminescence'
|
11574
11579
|
};
|
11575
11580
|
|
11576
11581
|
|
@@ -11687,6 +11692,7 @@ function publishExternalAPI(angular) {
|
|
11687
11692
|
$httpParamSerializer: $HttpParamSerializerProvider,
|
11688
11693
|
$httpParamSerializerJQLike: $HttpParamSerializerJQLikeProvider,
|
11689
11694
|
$httpBackend: $HttpBackendProvider,
|
11695
|
+
$xhrFactory: $xhrFactoryProvider,
|
11690
11696
|
$location: $LocationProvider,
|
11691
11697
|
$log: $LogProvider,
|
11692
11698
|
$parse: $ParseProvider,
|
@@ -11775,7 +11781,7 @@ function publishExternalAPI(angular) {
|
|
11775
11781
|
* - [`html()`](http://api.jquery.com/html/)
|
11776
11782
|
* - [`next()`](http://api.jquery.com/next/) - Does not support selectors
|
11777
11783
|
* - [`on()`](http://api.jquery.com/on/) - Does not support namespaces, selectors or eventData
|
11778
|
-
* - [`off()`](http://api.jquery.com/off/) - Does not support namespaces or
|
11784
|
+
* - [`off()`](http://api.jquery.com/off/) - Does not support namespaces, selectors or event object as parameter
|
11779
11785
|
* - [`one()`](http://api.jquery.com/one/) - Does not support namespaces or selectors
|
11780
11786
|
* - [`parent()`](http://api.jquery.com/parent/) - Does not support selectors
|
11781
11787
|
* - [`prepend()`](http://api.jquery.com/prepend/)
|
@@ -11789,7 +11795,7 @@ function publishExternalAPI(angular) {
|
|
11789
11795
|
* - [`text()`](http://api.jquery.com/text/)
|
11790
11796
|
* - [`toggleClass()`](http://api.jquery.com/toggleClass/)
|
11791
11797
|
* - [`triggerHandler()`](http://api.jquery.com/triggerHandler/) - Passes a dummy event object to handlers.
|
11792
|
-
* - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces
|
11798
|
+
* - [`unbind()`](http://api.jquery.com/unbind/) - Does not support namespaces or event object as parameter
|
11793
11799
|
* - [`val()`](http://api.jquery.com/val/)
|
11794
11800
|
* - [`wrap()`](http://api.jquery.com/wrap/)
|
11795
11801
|
*
|
@@ -11861,10 +11867,10 @@ function camelCase(name) {
|
|
11861
11867
|
replace(MOZ_HACK_REGEXP, 'Moz$1');
|
11862
11868
|
}
|
11863
11869
|
|
11864
|
-
var SINGLE_TAG_REGEXP = /^<(\w+)\s*\/?>(?:<\/\1>|)$/;
|
11870
|
+
var SINGLE_TAG_REGEXP = /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/;
|
11865
11871
|
var HTML_REGEXP = /<|&#?\w+;/;
|
11866
|
-
var TAG_NAME_REGEXP = /<([\w
|
11867
|
-
var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w
|
11872
|
+
var TAG_NAME_REGEXP = /<([\w:-]+)/;
|
11873
|
+
var XHTML_TAG_REGEXP = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi;
|
11868
11874
|
|
11869
11875
|
var wrapMap = {
|
11870
11876
|
'option': [1, '<select multiple="multiple">', '</select>'],
|
@@ -12160,7 +12166,7 @@ function jqLiteInheritedData(element, name, value) {
|
|
12160
12166
|
|
12161
12167
|
while (element) {
|
12162
12168
|
for (var i = 0, ii = names.length; i < ii; i++) {
|
12163
|
-
if ((value = jqLite.data(element, names[i]))
|
12169
|
+
if (isDefined(value = jqLite.data(element, names[i]))) return value;
|
12164
12170
|
}
|
12165
12171
|
|
12166
12172
|
// If dealing with a document fragment node with a host element, and no parent, use the host
|
@@ -12266,9 +12272,8 @@ function getBooleanAttrName(element, name) {
|
|
12266
12272
|
return booleanAttr && BOOLEAN_ELEMENTS[nodeName_(element)] && booleanAttr;
|
12267
12273
|
}
|
12268
12274
|
|
12269
|
-
function getAliasedAttrName(
|
12270
|
-
|
12271
|
-
return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name];
|
12275
|
+
function getAliasedAttrName(name) {
|
12276
|
+
return ALIASED_ATTR[name];
|
12272
12277
|
}
|
12273
12278
|
|
12274
12279
|
forEach({
|
@@ -12405,7 +12410,7 @@ forEach({
|
|
12405
12410
|
// in a way that survives minification.
|
12406
12411
|
// jqLiteEmpty takes no arguments but is a setter.
|
12407
12412
|
if (fn !== jqLiteEmpty &&
|
12408
|
-
(((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2)
|
12413
|
+
(isUndefined((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2))) {
|
12409
12414
|
if (isObject(arg1)) {
|
12410
12415
|
|
12411
12416
|
// we are a write, but the object properties are the key/values
|
@@ -12426,7 +12431,7 @@ forEach({
|
|
12426
12431
|
// TODO: do we still need this?
|
12427
12432
|
var value = fn.$dv;
|
12428
12433
|
// Only if we have $dv do we iterate over all, otherwise it is just the first element.
|
12429
|
-
var jj = (value
|
12434
|
+
var jj = (isUndefined(value)) ? Math.min(nodeCount, 1) : nodeCount;
|
12430
12435
|
for (var j = 0; j < jj; j++) {
|
12431
12436
|
var nodeValue = fn(this[j], arg1, arg2);
|
12432
12437
|
value = value ? value + nodeValue : nodeValue;
|
@@ -14065,61 +14070,66 @@ var $$CoreAnimateQueueProvider = function() {
|
|
14065
14070
|
}
|
14066
14071
|
};
|
14067
14072
|
|
14068
|
-
function addRemoveClassesPostDigest(element, add, remove) {
|
14069
|
-
var classVal, data = postDigestQueue.get(element);
|
14070
14073
|
|
14071
|
-
|
14072
|
-
|
14073
|
-
|
14074
|
+
function updateData(data, classes, value) {
|
14075
|
+
var changed = false;
|
14076
|
+
if (classes) {
|
14077
|
+
classes = isString(classes) ? classes.split(' ') :
|
14078
|
+
isArray(classes) ? classes : [];
|
14079
|
+
forEach(classes, function(className) {
|
14080
|
+
if (className) {
|
14081
|
+
changed = true;
|
14082
|
+
data[className] = value;
|
14083
|
+
}
|
14084
|
+
});
|
14074
14085
|
}
|
14075
|
-
|
14076
|
-
|
14077
|
-
|
14078
|
-
|
14079
|
-
|
14080
|
-
|
14081
|
-
|
14082
|
-
|
14083
|
-
|
14084
|
-
|
14086
|
+
return changed;
|
14087
|
+
}
|
14088
|
+
|
14089
|
+
function handleCSSClassChanges() {
|
14090
|
+
forEach(postDigestElements, function(element) {
|
14091
|
+
var data = postDigestQueue.get(element);
|
14092
|
+
if (data) {
|
14093
|
+
var existing = splitClasses(element.attr('class'));
|
14094
|
+
var toAdd = '';
|
14095
|
+
var toRemove = '';
|
14096
|
+
forEach(data, function(status, className) {
|
14097
|
+
var hasClass = !!existing[className];
|
14098
|
+
if (status !== hasClass) {
|
14099
|
+
if (status) {
|
14100
|
+
toAdd += (toAdd.length ? ' ' : '') + className;
|
14101
|
+
} else {
|
14102
|
+
toRemove += (toRemove.length ? ' ' : '') + className;
|
14103
|
+
}
|
14085
14104
|
}
|
14086
14105
|
});
|
14106
|
+
|
14107
|
+
forEach(element, function(elm) {
|
14108
|
+
toAdd && jqLiteAddClass(elm, toAdd);
|
14109
|
+
toRemove && jqLiteRemoveClass(elm, toRemove);
|
14110
|
+
});
|
14111
|
+
postDigestQueue.remove(element);
|
14087
14112
|
}
|
14088
|
-
|
14089
|
-
|
14113
|
+
});
|
14114
|
+
postDigestElements.length = 0;
|
14115
|
+
}
|
14090
14116
|
|
14091
|
-
var classesAdded = updateData(add, true);
|
14092
|
-
var classesRemoved = updateData(remove, false);
|
14093
|
-
if ((!classesAdded && !classesRemoved) || postDigestElements.length > 1) return;
|
14094
|
-
|
14095
|
-
$rootScope.$$postDigest(function() {
|
14096
|
-
forEach(postDigestElements, function(element) {
|
14097
|
-
var data = postDigestQueue.get(element);
|
14098
|
-
if (data) {
|
14099
|
-
var existing = splitClasses(element.attr('class'));
|
14100
|
-
var toAdd = '';
|
14101
|
-
var toRemove = '';
|
14102
|
-
forEach(data, function(status, className) {
|
14103
|
-
var hasClass = !!existing[className];
|
14104
|
-
if (status !== hasClass) {
|
14105
|
-
if (status) {
|
14106
|
-
toAdd += (toAdd.length ? ' ' : '') + className;
|
14107
|
-
} else {
|
14108
|
-
toRemove += (toRemove.length ? ' ' : '') + className;
|
14109
|
-
}
|
14110
|
-
}
|
14111
|
-
});
|
14112
14117
|
|
14113
|
-
|
14114
|
-
|
14115
|
-
toRemove && jqLiteRemoveClass(elm, toRemove);
|
14116
|
-
});
|
14117
|
-
postDigestQueue.remove(element);
|
14118
|
-
}
|
14119
|
-
});
|
14118
|
+
function addRemoveClassesPostDigest(element, add, remove) {
|
14119
|
+
var data = postDigestQueue.get(element) || {};
|
14120
14120
|
|
14121
|
-
|
14122
|
-
|
14121
|
+
var classesAdded = updateData(data, add, true);
|
14122
|
+
var classesRemoved = updateData(data, remove, false);
|
14123
|
+
|
14124
|
+
if (classesAdded || classesRemoved) {
|
14125
|
+
|
14126
|
+
postDigestQueue.put(element, data);
|
14127
|
+
postDigestElements.push(element);
|
14128
|
+
|
14129
|
+
if (postDigestElements.length === 1) {
|
14130
|
+
$rootScope.$$postDigest(handleCSSClassChanges);
|
14131
|
+
}
|
14132
|
+
}
|
14123
14133
|
}
|
14124
14134
|
}];
|
14125
14135
|
};
|
@@ -14584,14 +14594,21 @@ var $CoreAnimateCssProvider = function() {
|
|
14584
14594
|
return this.getPromise().then(f1,f2);
|
14585
14595
|
},
|
14586
14596
|
'catch': function(f1) {
|
14587
|
-
return this.getPromise()
|
14597
|
+
return this.getPromise()['catch'](f1);
|
14588
14598
|
},
|
14589
14599
|
'finally': function(f1) {
|
14590
|
-
return this.getPromise()
|
14600
|
+
return this.getPromise()['finally'](f1);
|
14591
14601
|
}
|
14592
14602
|
};
|
14593
14603
|
|
14594
14604
|
return function(element, options) {
|
14605
|
+
// there is no point in applying the styles since
|
14606
|
+
// there is no animation that goes on at all in
|
14607
|
+
// this version of $animateCss.
|
14608
|
+
if (options.cleanupStyles) {
|
14609
|
+
options.from = options.to = null;
|
14610
|
+
}
|
14611
|
+
|
14595
14612
|
if (options.from) {
|
14596
14613
|
element.css(options.from);
|
14597
14614
|
options.from = null;
|
@@ -14720,7 +14737,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
14720
14737
|
var cachedState, lastHistoryState,
|
14721
14738
|
lastBrowserUrl = location.href,
|
14722
14739
|
baseElement = document.find('base'),
|
14723
|
-
|
14740
|
+
pendingLocation = null;
|
14724
14741
|
|
14725
14742
|
cacheState();
|
14726
14743
|
lastHistoryState = cachedState;
|
@@ -14780,8 +14797,8 @@ function Browser(window, document, $log, $sniffer) {
|
|
14780
14797
|
// Do the assignment again so that those two variables are referentially identical.
|
14781
14798
|
lastHistoryState = cachedState;
|
14782
14799
|
} else {
|
14783
|
-
if (!sameBase ||
|
14784
|
-
|
14800
|
+
if (!sameBase || pendingLocation) {
|
14801
|
+
pendingLocation = url;
|
14785
14802
|
}
|
14786
14803
|
if (replace) {
|
14787
14804
|
location.replace(url);
|
@@ -14790,14 +14807,18 @@ function Browser(window, document, $log, $sniffer) {
|
|
14790
14807
|
} else {
|
14791
14808
|
location.hash = getHash(url);
|
14792
14809
|
}
|
14810
|
+
if (location.href !== url) {
|
14811
|
+
pendingLocation = url;
|
14812
|
+
}
|
14793
14813
|
}
|
14794
14814
|
return self;
|
14795
14815
|
// getter
|
14796
14816
|
} else {
|
14797
|
-
// -
|
14798
|
-
// the new location.href if a reload happened
|
14817
|
+
// - pendingLocation is needed as browsers don't allow to read out
|
14818
|
+
// the new location.href if a reload happened or if there is a bug like in iOS 9 (see
|
14819
|
+
// https://openradar.appspot.com/22186109).
|
14799
14820
|
// - the replacement is a workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=407172
|
14800
|
-
return
|
14821
|
+
return pendingLocation || location.href.replace(/%27/g,"'");
|
14801
14822
|
}
|
14802
14823
|
};
|
14803
14824
|
|
@@ -14819,6 +14840,7 @@ function Browser(window, document, $log, $sniffer) {
|
|
14819
14840
|
urlChangeInit = false;
|
14820
14841
|
|
14821
14842
|
function cacheStateAndFireUrlChange() {
|
14843
|
+
pendingLocation = null;
|
14822
14844
|
cacheState();
|
14823
14845
|
fireUrlChange();
|
14824
14846
|
}
|
@@ -15054,10 +15076,10 @@ function $BrowserProvider() {
|
|
15054
15076
|
$scope.keys = [];
|
15055
15077
|
$scope.cache = $cacheFactory('cacheId');
|
15056
15078
|
$scope.put = function(key, value) {
|
15057
|
-
if ($scope.cache.get(key)
|
15079
|
+
if (angular.isUndefined($scope.cache.get(key))) {
|
15058
15080
|
$scope.keys.push(key);
|
15059
15081
|
}
|
15060
|
-
$scope.cache.put(key, value
|
15082
|
+
$scope.cache.put(key, angular.isUndefined(value) ? null : value);
|
15061
15083
|
};
|
15062
15084
|
}]);
|
15063
15085
|
</file>
|
@@ -15533,18 +15555,24 @@ function $TemplateCacheProvider() {
|
|
15533
15555
|
* and other directives used in the directive's template will also be excluded from execution.
|
15534
15556
|
*
|
15535
15557
|
* #### `scope`
|
15536
|
-
*
|
15537
|
-
*
|
15538
|
-
*
|
15558
|
+
* The scope property can be `true`, an object or a falsy value:
|
15559
|
+
*
|
15560
|
+
* * **falsy:** No scope will be created for the directive. The directive will use its parent's scope.
|
15561
|
+
*
|
15562
|
+
* * **`true`:** A new child scope that prototypically inherits from its parent will be created for
|
15563
|
+
* the directive's element. If multiple directives on the same element request a new scope,
|
15564
|
+
* only one new scope is created. The new scope rule does not apply for the root of the template
|
15565
|
+
* since the root of the template always gets a new scope.
|
15539
15566
|
*
|
15540
|
-
*
|
15541
|
-
* normal scope in that it does not prototypically inherit from
|
15542
|
-
* when creating reusable components, which should not accidentally read or modify
|
15543
|
-
* parent scope.
|
15567
|
+
* * **`{...}` (an object hash):** A new "isolate" scope is created for the directive's element. The
|
15568
|
+
* 'isolate' scope differs from normal scope in that it does not prototypically inherit from its parent
|
15569
|
+
* scope. This is useful when creating reusable components, which should not accidentally read or modify
|
15570
|
+
* data in the parent scope.
|
15544
15571
|
*
|
15545
|
-
* The 'isolate' scope
|
15546
|
-
*
|
15547
|
-
*
|
15572
|
+
* The 'isolate' scope object hash defines a set of local scope properties derived from attributes on the
|
15573
|
+
* directive's element. These local properties are useful for aliasing values for templates. The keys in
|
15574
|
+
* the object hash map to the name of the property on the isolate scope; the values define how the property
|
15575
|
+
* is bound to the parent scope, via matching attributes on the directive's element:
|
15548
15576
|
*
|
15549
15577
|
* * `@` or `@attr` - bind a local scope property to the value of DOM attribute. The result is
|
15550
15578
|
* always a string since DOM attributes are strings. If no `attr` name is specified then the
|
@@ -15577,6 +15605,20 @@ function $TemplateCacheProvider() {
|
|
15577
15605
|
* For example, if the expression is `increment(amount)` then we can specify the amount value
|
15578
15606
|
* by calling the `localFn` as `localFn({amount: 22})`.
|
15579
15607
|
*
|
15608
|
+
* In general it's possible to apply more than one directive to one element, but there might be limitations
|
15609
|
+
* depending on the type of scope required by the directives. The following points will help explain these limitations.
|
15610
|
+
* For simplicity only two directives are taken into account, but it is also applicable for several directives:
|
15611
|
+
*
|
15612
|
+
* * **no scope** + **no scope** => Two directives which don't require their own scope will use their parent's scope
|
15613
|
+
* * **child scope** + **no scope** => Both directives will share one single child scope
|
15614
|
+
* * **child scope** + **child scope** => Both directives will share one single child scope
|
15615
|
+
* * **isolated scope** + **no scope** => The isolated directive will use it's own created isolated scope. The other directive will use
|
15616
|
+
* its parent's scope
|
15617
|
+
* * **isolated scope** + **child scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives cannot
|
15618
|
+
* be applied to the same element.
|
15619
|
+
* * **isolated scope** + **isolated scope** => **Won't work!** Only one scope can be related to one element. Therefore these directives
|
15620
|
+
* cannot be applied to the same element.
|
15621
|
+
*
|
15580
15622
|
*
|
15581
15623
|
* #### `bindToController`
|
15582
15624
|
* When an isolate scope is used for a component (see above), and `controllerAs` is used, `bindToController: true` will
|
@@ -15585,7 +15627,7 @@ function $TemplateCacheProvider() {
|
|
15585
15627
|
*
|
15586
15628
|
* #### `controller`
|
15587
15629
|
* Controller constructor function. The controller is instantiated before the
|
15588
|
-
* pre-linking phase and
|
15630
|
+
* pre-linking phase and can be accessed by other directives (see
|
15589
15631
|
* `require` attribute). This allows the directives to communicate with each other and augment
|
15590
15632
|
* each other's behavior. The controller is injectable (and supports bracket notation) with the following locals:
|
15591
15633
|
*
|
@@ -15625,9 +15667,10 @@ function $TemplateCacheProvider() {
|
|
15625
15667
|
*
|
15626
15668
|
* #### `controllerAs`
|
15627
15669
|
* Identifier name for a reference to the controller in the directive's scope.
|
15628
|
-
* This allows the controller to be referenced from the directive template.
|
15629
|
-
*
|
15630
|
-
* directive
|
15670
|
+
* This allows the controller to be referenced from the directive template. This is especially
|
15671
|
+
* useful when a directive is used as component, i.e. with an `isolate` scope. It's also possible
|
15672
|
+
* to use it in a directive without an `isolate` / `new` scope, but you need to be aware that the
|
15673
|
+
* `controllerAs` reference might overwrite a property that already exists on the parent scope.
|
15631
15674
|
*
|
15632
15675
|
*
|
15633
15676
|
* #### `restrict`
|
@@ -16464,7 +16507,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16464
16507
|
|
16465
16508
|
var node = this.$$element[0],
|
16466
16509
|
booleanKey = getBooleanAttrName(node, key),
|
16467
|
-
aliasedKey = getAliasedAttrName(
|
16510
|
+
aliasedKey = getAliasedAttrName(key),
|
16468
16511
|
observer = key,
|
16469
16512
|
nodeName;
|
16470
16513
|
|
@@ -16531,7 +16574,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16531
16574
|
}
|
16532
16575
|
|
16533
16576
|
if (writeAttr !== false) {
|
16534
|
-
if (value === null || value
|
16577
|
+
if (value === null || isUndefined(value)) {
|
16535
16578
|
this.$$element.removeAttr(attrName);
|
16536
16579
|
} else {
|
16537
16580
|
this.$$element.attr(attrName, value);
|
@@ -17497,7 +17540,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17497
17540
|
i = 0, ii = directives.length; i < ii; i++) {
|
17498
17541
|
try {
|
17499
17542
|
directive = directives[i];
|
17500
|
-
if ((maxPriority
|
17543
|
+
if ((isUndefined(maxPriority) || maxPriority > directive.priority) &&
|
17501
17544
|
directive.restrict.indexOf(location) != -1) {
|
17502
17545
|
if (startAttrName) {
|
17503
17546
|
directive = inherit(directive, {$$start: startAttrName, $$end: endAttrName});
|
@@ -17793,7 +17836,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
17793
17836
|
compile: function() {
|
17794
17837
|
return {
|
17795
17838
|
pre: function attrInterpolatePreLinkFn(scope, element, attr) {
|
17796
|
-
var $$observers = (attr.$$observers || (attr.$$observers =
|
17839
|
+
var $$observers = (attr.$$observers || (attr.$$observers = createMap()));
|
17797
17840
|
|
17798
17841
|
if (EVENT_HANDLER_ATTR_REGEXP.test(name)) {
|
17799
17842
|
throw $compileMinErr('nodomevents',
|
@@ -18845,28 +18888,18 @@ function $HttpProvider() {
|
|
18845
18888
|
*
|
18846
18889
|
*
|
18847
18890
|
* ## General usage
|
18848
|
-
* The `$http` service is a function which takes a single argument — a configuration object —
|
18891
|
+
* The `$http` service is a function which takes a single argument — a {@link $http#usage configuration object} —
|
18849
18892
|
* that is used to generate an HTTP request and returns a {@link ng.$q promise}.
|
18850
18893
|
*
|
18851
18894
|
* ```js
|
18852
|
-
* // Simple GET request example
|
18853
|
-
* $http
|
18854
|
-
*
|
18855
|
-
*
|
18856
|
-
*
|
18857
|
-
* }, function(response) {
|
18858
|
-
* // called asynchronously if an error occurs
|
18859
|
-
* // or server returns response with an error status.
|
18860
|
-
* });
|
18861
|
-
* ```
|
18862
|
-
*
|
18863
|
-
* ```js
|
18864
|
-
* // Simple POST request example (passing data) :
|
18865
|
-
* $http.post('/someUrl', {msg:'hello word!'}).
|
18866
|
-
* then(function(response) {
|
18895
|
+
* // Simple GET request example:
|
18896
|
+
* $http({
|
18897
|
+
* method: 'GET',
|
18898
|
+
* url: '/someUrl'
|
18899
|
+
* }).then(function successCallback(response) {
|
18867
18900
|
* // this callback will be called asynchronously
|
18868
18901
|
* // when the response is available
|
18869
|
-
* }, function(response) {
|
18902
|
+
* }, function errorCallback(response) {
|
18870
18903
|
* // called asynchronously if an error occurs
|
18871
18904
|
* // or server returns response with an error status.
|
18872
18905
|
* });
|
@@ -18886,25 +18919,16 @@ function $HttpProvider() {
|
|
18886
18919
|
* XMLHttpRequest will transparently follow it, meaning that the error callback will not be
|
18887
18920
|
* called for such responses.
|
18888
18921
|
*
|
18889
|
-
* ## Writing Unit Tests that use $http
|
18890
|
-
* When unit testing (using {@link ngMock ngMock}), it is necessary to call
|
18891
|
-
* {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending
|
18892
|
-
* request using trained responses.
|
18893
|
-
*
|
18894
|
-
* ```
|
18895
|
-
* $httpBackend.expectGET(...);
|
18896
|
-
* $http.get(...);
|
18897
|
-
* $httpBackend.flush();
|
18898
|
-
* ```
|
18899
18922
|
*
|
18900
18923
|
* ## Shortcut methods
|
18901
18924
|
*
|
18902
18925
|
* Shortcut methods are also available. All shortcut methods require passing in the URL, and
|
18903
|
-
* request data must be passed in for POST/PUT requests.
|
18926
|
+
* request data must be passed in for POST/PUT requests. An optional config can be passed as the
|
18927
|
+
* last argument.
|
18904
18928
|
*
|
18905
18929
|
* ```js
|
18906
|
-
* $http.get('/someUrl').then(successCallback);
|
18907
|
-
* $http.post('/someUrl', data).then(successCallback);
|
18930
|
+
* $http.get('/someUrl', config).then(successCallback, errorCallback);
|
18931
|
+
* $http.post('/someUrl', data, config).then(successCallback, errorCallback);
|
18908
18932
|
* ```
|
18909
18933
|
*
|
18910
18934
|
* Complete list of shortcut methods:
|
@@ -18918,6 +18942,17 @@ function $HttpProvider() {
|
|
18918
18942
|
* - {@link ng.$http#patch $http.patch}
|
18919
18943
|
*
|
18920
18944
|
*
|
18945
|
+
* ## Writing Unit Tests that use $http
|
18946
|
+
* When unit testing (using {@link ngMock ngMock}), it is necessary to call
|
18947
|
+
* {@link ngMock.$httpBackend#flush $httpBackend.flush()} to flush each pending
|
18948
|
+
* request using trained responses.
|
18949
|
+
*
|
18950
|
+
* ```
|
18951
|
+
* $httpBackend.expectGET(...);
|
18952
|
+
* $http.get(...);
|
18953
|
+
* $httpBackend.flush();
|
18954
|
+
* ```
|
18955
|
+
*
|
18921
18956
|
* ## Deprecation Notice
|
18922
18957
|
* <div class="alert alert-danger">
|
18923
18958
|
* The `$http` legacy promise methods `success` and `error` have been deprecated.
|
@@ -19075,7 +19110,7 @@ function $HttpProvider() {
|
|
19075
19110
|
*
|
19076
19111
|
* There are two kinds of interceptors (and two kinds of rejection interceptors):
|
19077
19112
|
*
|
19078
|
-
* * `request`: interceptors get called with a http
|
19113
|
+
* * `request`: interceptors get called with a http {@link $http#usage config} object. The function is free to
|
19079
19114
|
* modify the `config` object or create a new one. The function needs to return the `config`
|
19080
19115
|
* object directly, or a promise containing the `config` or a new `config` object.
|
19081
19116
|
* * `requestError`: interceptor gets called when a previous interceptor threw an error or
|
@@ -19709,8 +19744,8 @@ function $HttpProvider() {
|
|
19709
19744
|
* Resolves the raw $http promise.
|
19710
19745
|
*/
|
19711
19746
|
function resolvePromise(response, status, headers, statusText) {
|
19712
|
-
//
|
19713
|
-
status =
|
19747
|
+
//status: HTTP response status code, 0, -1 (aborted by timeout / promise)
|
19748
|
+
status = status >= -1 ? status : 0;
|
19714
19749
|
|
19715
19750
|
(isSuccess(status) ? deferred.resolve : deferred.reject)({
|
19716
19751
|
data: response,
|
@@ -19741,8 +19776,33 @@ function $HttpProvider() {
|
|
19741
19776
|
}];
|
19742
19777
|
}
|
19743
19778
|
|
19744
|
-
|
19745
|
-
|
19779
|
+
/**
|
19780
|
+
* @ngdoc service
|
19781
|
+
* @name $xhrFactory
|
19782
|
+
*
|
19783
|
+
* @description
|
19784
|
+
* Factory function used to create XMLHttpRequest objects.
|
19785
|
+
*
|
19786
|
+
* Replace or decorate this service to create your own custom XMLHttpRequest objects.
|
19787
|
+
*
|
19788
|
+
* ```
|
19789
|
+
* angular.module('myApp', [])
|
19790
|
+
* .factory('$xhrFactory', function() {
|
19791
|
+
* return function createXhr(method, url) {
|
19792
|
+
* return new window.XMLHttpRequest({mozSystem: true});
|
19793
|
+
* };
|
19794
|
+
* });
|
19795
|
+
* ```
|
19796
|
+
*
|
19797
|
+
* @param {string} method HTTP method of the request (GET, POST, PUT, ..)
|
19798
|
+
* @param {string} url URL of the request.
|
19799
|
+
*/
|
19800
|
+
function $xhrFactoryProvider() {
|
19801
|
+
this.$get = function() {
|
19802
|
+
return function createXhr() {
|
19803
|
+
return new window.XMLHttpRequest();
|
19804
|
+
};
|
19805
|
+
};
|
19746
19806
|
}
|
19747
19807
|
|
19748
19808
|
/**
|
@@ -19750,6 +19810,7 @@ function createXhr() {
|
|
19750
19810
|
* @name $httpBackend
|
19751
19811
|
* @requires $window
|
19752
19812
|
* @requires $document
|
19813
|
+
* @requires $xhrFactory
|
19753
19814
|
*
|
19754
19815
|
* @description
|
19755
19816
|
* HTTP backend used by the {@link ng.$http service} that delegates to
|
@@ -19762,8 +19823,8 @@ function createXhr() {
|
|
19762
19823
|
* $httpBackend} which can be trained with responses.
|
19763
19824
|
*/
|
19764
19825
|
function $HttpBackendProvider() {
|
19765
|
-
this.$get = ['$browser', '$window', '$document', function($browser, $window, $document) {
|
19766
|
-
return createHttpBackend($browser,
|
19826
|
+
this.$get = ['$browser', '$window', '$document', '$xhrFactory', function($browser, $window, $document, $xhrFactory) {
|
19827
|
+
return createHttpBackend($browser, $xhrFactory, $browser.defer, $window.angular.callbacks, $document[0]);
|
19767
19828
|
}];
|
19768
19829
|
}
|
19769
19830
|
|
@@ -19787,7 +19848,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
19787
19848
|
});
|
19788
19849
|
} else {
|
19789
19850
|
|
19790
|
-
var xhr = createXhr();
|
19851
|
+
var xhr = createXhr(method, url);
|
19791
19852
|
|
19792
19853
|
xhr.open(method, url, true);
|
19793
19854
|
forEach(headers, function(value, key) {
|
@@ -19850,7 +19911,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
19850
19911
|
}
|
19851
19912
|
}
|
19852
19913
|
|
19853
|
-
xhr.send(post);
|
19914
|
+
xhr.send(isUndefined(post) ? null : post);
|
19854
19915
|
}
|
19855
19916
|
|
19856
19917
|
if (timeout > 0) {
|
@@ -19867,7 +19928,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
19867
19928
|
|
19868
19929
|
function completeRequest(callback, status, response, headersString, statusText) {
|
19869
19930
|
// cancel timeout and subsequent timeout promise resolution
|
19870
|
-
if (timeoutId
|
19931
|
+
if (isDefined(timeoutId)) {
|
19871
19932
|
$browserDefer.cancel(timeoutId);
|
19872
19933
|
}
|
19873
19934
|
jsonpDone = xhr = null;
|
@@ -20053,7 +20114,7 @@ function $InterpolateProvider() {
|
|
20053
20114
|
* ```js
|
20054
20115
|
* var $interpolate = ...; // injected
|
20055
20116
|
* var exp = $interpolate('Hello {{name | uppercase}}!');
|
20056
|
-
* expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
|
20117
|
+
* expect(exp({name:'Angular'})).toEqual('Hello ANGULAR!');
|
20057
20118
|
* ```
|
20058
20119
|
*
|
20059
20120
|
* `$interpolate` takes an optional fourth argument, `allOrNothing`. If `allOrNothing` is
|
@@ -20606,14 +20667,14 @@ function LocationHtml5Url(appBase, appBaseNoFile, basePrefix) {
|
|
20606
20667
|
var appUrl, prevAppUrl;
|
20607
20668
|
var rewrittenUrl;
|
20608
20669
|
|
20609
|
-
if ((appUrl = beginsWith(appBase, url))
|
20670
|
+
if (isDefined(appUrl = beginsWith(appBase, url))) {
|
20610
20671
|
prevAppUrl = appUrl;
|
20611
|
-
if ((appUrl = beginsWith(basePrefix, appUrl))
|
20672
|
+
if (isDefined(appUrl = beginsWith(basePrefix, appUrl))) {
|
20612
20673
|
rewrittenUrl = appBaseNoFile + (beginsWith('/', appUrl) || appUrl);
|
20613
20674
|
} else {
|
20614
20675
|
rewrittenUrl = appBase + prevAppUrl;
|
20615
20676
|
}
|
20616
|
-
} else if ((appUrl = beginsWith(appBaseNoFile, url))
|
20677
|
+
} else if (isDefined(appUrl = beginsWith(appBaseNoFile, url))) {
|
20617
20678
|
rewrittenUrl = appBaseNoFile + appUrl;
|
20618
20679
|
} else if (appBaseNoFile == url + '/') {
|
20619
20680
|
rewrittenUrl = appBaseNoFile;
|
@@ -21666,6 +21727,25 @@ function ensureSafeMemberName(name, fullExpression) {
|
|
21666
21727
|
return name;
|
21667
21728
|
}
|
21668
21729
|
|
21730
|
+
function getStringValue(name, fullExpression) {
|
21731
|
+
// From the JavaScript docs:
|
21732
|
+
// Property names must be strings. This means that non-string objects cannot be used
|
21733
|
+
// as keys in an object. Any non-string object, including a number, is typecasted
|
21734
|
+
// into a string via the toString method.
|
21735
|
+
//
|
21736
|
+
// So, to ensure that we are checking the same `name` that JavaScript would use,
|
21737
|
+
// we cast it to a string, if possible.
|
21738
|
+
// Doing `name + ''` can cause a repl error if the result to `toString` is not a string,
|
21739
|
+
// this is, this will handle objects that misbehave.
|
21740
|
+
name = name + '';
|
21741
|
+
if (!isString(name)) {
|
21742
|
+
throw $parseMinErr('iseccst',
|
21743
|
+
'Cannot convert object to primitive value! '
|
21744
|
+
+ 'Expression: {0}', fullExpression);
|
21745
|
+
}
|
21746
|
+
return name;
|
21747
|
+
}
|
21748
|
+
|
21669
21749
|
function ensureSafeObject(obj, fullExpression) {
|
21670
21750
|
// nifty check if obj is Function that is fast and works across iframes and other contexts
|
21671
21751
|
if (obj) {
|
@@ -21711,6 +21791,16 @@ function ensureSafeFunction(obj, fullExpression) {
|
|
21711
21791
|
}
|
21712
21792
|
}
|
21713
21793
|
|
21794
|
+
function ensureSafeAssignContext(obj, fullExpression) {
|
21795
|
+
if (obj) {
|
21796
|
+
if (obj === (0).constructor || obj === (false).constructor || obj === ''.constructor ||
|
21797
|
+
obj === {}.constructor || obj === [].constructor || obj === Function.constructor) {
|
21798
|
+
throw $parseMinErr('isecaf',
|
21799
|
+
'Assigning to a constructor is disallowed! Expression: {0}', fullExpression);
|
21800
|
+
}
|
21801
|
+
}
|
21802
|
+
}
|
21803
|
+
|
21714
21804
|
var OPERATORS = createMap();
|
21715
21805
|
forEach('+ - * / % === !== == != < > <= >= && || ! = |'.split(' '), function(operator) { OPERATORS[operator] = true; });
|
21716
21806
|
var ESCAPE = {"n":"\n", "f":"\f", "r":"\r", "t":"\t", "v":"\v", "'":"'", '"':'"'};
|
@@ -22392,6 +22482,7 @@ ASTCompiler.prototype = {
|
|
22392
22482
|
this.state.computing = 'assign';
|
22393
22483
|
var result = this.nextId();
|
22394
22484
|
this.recurse(assignable, result);
|
22485
|
+
this.return_(result);
|
22395
22486
|
extra = 'fn.assign=' + this.generateFunction('assign', 's,v,l');
|
22396
22487
|
}
|
22397
22488
|
var toWatch = getInputs(ast.body);
|
@@ -22424,6 +22515,8 @@ ASTCompiler.prototype = {
|
|
22424
22515
|
'ensureSafeMemberName',
|
22425
22516
|
'ensureSafeObject',
|
22426
22517
|
'ensureSafeFunction',
|
22518
|
+
'getStringValue',
|
22519
|
+
'ensureSafeAssignContext',
|
22427
22520
|
'ifDefined',
|
22428
22521
|
'plus',
|
22429
22522
|
'text',
|
@@ -22432,6 +22525,8 @@ ASTCompiler.prototype = {
|
|
22432
22525
|
ensureSafeMemberName,
|
22433
22526
|
ensureSafeObject,
|
22434
22527
|
ensureSafeFunction,
|
22528
|
+
getStringValue,
|
22529
|
+
ensureSafeAssignContext,
|
22435
22530
|
ifDefined,
|
22436
22531
|
plusFn,
|
22437
22532
|
expression);
|
@@ -22575,6 +22670,7 @@ ASTCompiler.prototype = {
|
|
22575
22670
|
if (ast.computed) {
|
22576
22671
|
right = self.nextId();
|
22577
22672
|
self.recurse(ast.property, right);
|
22673
|
+
self.getStringValue(right);
|
22578
22674
|
self.addEnsureSafeMemberName(right);
|
22579
22675
|
if (create && create !== 1) {
|
22580
22676
|
self.if_(self.not(self.computedMember(left, right)), self.lazyAssign(self.computedMember(left, right), '{}'));
|
@@ -22658,6 +22754,7 @@ ASTCompiler.prototype = {
|
|
22658
22754
|
self.if_(self.notNull(left.context), function() {
|
22659
22755
|
self.recurse(ast.right, right);
|
22660
22756
|
self.addEnsureSafeObject(self.member(left.context, left.name, left.computed));
|
22757
|
+
self.addEnsureSafeAssignContext(left.context);
|
22661
22758
|
expression = self.member(left.context, left.name, left.computed) + ast.operator + right;
|
22662
22759
|
self.assign(intoId, expression);
|
22663
22760
|
recursionFn(intoId || expression);
|
@@ -22783,6 +22880,10 @@ ASTCompiler.prototype = {
|
|
22783
22880
|
this.current().body.push(this.ensureSafeFunction(item), ';');
|
22784
22881
|
},
|
22785
22882
|
|
22883
|
+
addEnsureSafeAssignContext: function(item) {
|
22884
|
+
this.current().body.push(this.ensureSafeAssignContext(item), ';');
|
22885
|
+
},
|
22886
|
+
|
22786
22887
|
ensureSafeObject: function(item) {
|
22787
22888
|
return 'ensureSafeObject(' + item + ',text)';
|
22788
22889
|
},
|
@@ -22795,6 +22896,14 @@ ASTCompiler.prototype = {
|
|
22795
22896
|
return 'ensureSafeFunction(' + item + ',text)';
|
22796
22897
|
},
|
22797
22898
|
|
22899
|
+
getStringValue: function(item) {
|
22900
|
+
this.assign(item, 'getStringValue(' + item + ',text)');
|
22901
|
+
},
|
22902
|
+
|
22903
|
+
ensureSafeAssignContext: function(item) {
|
22904
|
+
return 'ensureSafeAssignContext(' + item + ',text)';
|
22905
|
+
},
|
22906
|
+
|
22798
22907
|
lazyRecurse: function(ast, intoId, nameId, recursionFn, create, skipWatchIdCheck) {
|
22799
22908
|
var self = this;
|
22800
22909
|
return function() {
|
@@ -22972,6 +23081,7 @@ ASTInterpreter.prototype = {
|
|
22972
23081
|
var lhs = left(scope, locals, assign, inputs);
|
22973
23082
|
var rhs = right(scope, locals, assign, inputs);
|
22974
23083
|
ensureSafeObject(lhs.value, self.expression);
|
23084
|
+
ensureSafeAssignContext(lhs.context);
|
22975
23085
|
lhs.context[lhs.name] = rhs;
|
22976
23086
|
return context ? {value: rhs} : rhs;
|
22977
23087
|
};
|
@@ -23169,6 +23279,7 @@ ASTInterpreter.prototype = {
|
|
23169
23279
|
var value;
|
23170
23280
|
if (lhs != null) {
|
23171
23281
|
rhs = right(scope, locals, assign, inputs);
|
23282
|
+
rhs = getStringValue(rhs);
|
23172
23283
|
ensureSafeMemberName(rhs, expression);
|
23173
23284
|
if (create && create !== 1 && lhs && !(lhs[rhs])) {
|
23174
23285
|
lhs[rhs] = {};
|
@@ -24109,7 +24220,7 @@ function $$RAFProvider() { //rAF
|
|
24109
24220
|
$window.webkitCancelRequestAnimationFrame;
|
24110
24221
|
|
24111
24222
|
var rafSupported = !!requestAnimationFrame;
|
24112
|
-
var
|
24223
|
+
var raf = rafSupported
|
24113
24224
|
? function(fn) {
|
24114
24225
|
var id = requestAnimationFrame(fn);
|
24115
24226
|
return function() {
|
@@ -24123,47 +24234,9 @@ function $$RAFProvider() { //rAF
|
|
24123
24234
|
};
|
24124
24235
|
};
|
24125
24236
|
|
24126
|
-
|
24127
|
-
|
24128
|
-
var cancelLastRAF;
|
24129
|
-
var taskCount = 0;
|
24130
|
-
var taskQueue = [];
|
24131
|
-
return queueFn;
|
24132
|
-
|
24133
|
-
function flush() {
|
24134
|
-
for (var i = 0; i < taskQueue.length; i++) {
|
24135
|
-
var task = taskQueue[i];
|
24136
|
-
if (task) {
|
24137
|
-
taskQueue[i] = null;
|
24138
|
-
task();
|
24139
|
-
}
|
24140
|
-
}
|
24141
|
-
taskCount = taskQueue.length = 0;
|
24142
|
-
}
|
24143
|
-
|
24144
|
-
function queueFn(asyncFn) {
|
24145
|
-
var index = taskQueue.length;
|
24237
|
+
raf.supported = rafSupported;
|
24146
24238
|
|
24147
|
-
|
24148
|
-
taskQueue.push(asyncFn);
|
24149
|
-
|
24150
|
-
if (index === 0) {
|
24151
|
-
cancelLastRAF = rafFn(flush);
|
24152
|
-
}
|
24153
|
-
|
24154
|
-
return function cancelQueueFn() {
|
24155
|
-
if (index >= 0) {
|
24156
|
-
taskQueue[index] = null;
|
24157
|
-
index = null;
|
24158
|
-
|
24159
|
-
if (--taskCount === 0 && cancelLastRAF) {
|
24160
|
-
cancelLastRAF();
|
24161
|
-
cancelLastRAF = null;
|
24162
|
-
taskQueue.length = 0;
|
24163
|
-
}
|
24164
|
-
}
|
24165
|
-
};
|
24166
|
-
}
|
24239
|
+
return raf;
|
24167
24240
|
}];
|
24168
24241
|
}
|
24169
24242
|
|
@@ -24420,10 +24493,10 @@ function $RootScopeProvider() {
|
|
24420
24493
|
* Registers a `listener` callback to be executed whenever the `watchExpression` changes.
|
24421
24494
|
*
|
24422
24495
|
* - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#$digest
|
24423
|
-
* $digest()} and should return the value that will be watched. (
|
24424
|
-
*
|
24425
|
-
* `watchExpression`
|
24426
|
-
*
|
24496
|
+
* $digest()} and should return the value that will be watched. (`watchExpression` should not change
|
24497
|
+
* its value when executed multiple times with the same input because it may be executed multiple
|
24498
|
+
* times by {@link ng.$rootScope.Scope#$digest $digest()}. That is, `watchExpression` should be
|
24499
|
+
* [idempotent](http://en.wikipedia.org/wiki/Idempotence).
|
24427
24500
|
* - The `listener` is called only when the value from the current `watchExpression` and the
|
24428
24501
|
* previous call to `watchExpression` are not equal (with the exception of the initial run,
|
24429
24502
|
* see below). Inequality is determined according to reference inequality,
|
@@ -24772,7 +24845,7 @@ function $RootScopeProvider() {
|
|
24772
24845
|
// copy the items to oldValue and look for changes.
|
24773
24846
|
newLength = 0;
|
24774
24847
|
for (key in newValue) {
|
24775
|
-
if (
|
24848
|
+
if (hasOwnProperty.call(newValue, key)) {
|
24776
24849
|
newLength++;
|
24777
24850
|
newItem = newValue[key];
|
24778
24851
|
oldItem = oldValue[key];
|
@@ -24794,7 +24867,7 @@ function $RootScopeProvider() {
|
|
24794
24867
|
// we used to have more keys, need to find them and destroy them.
|
24795
24868
|
changeDetected++;
|
24796
24869
|
for (key in oldValue) {
|
24797
|
-
if (!
|
24870
|
+
if (!hasOwnProperty.call(newValue, key)) {
|
24798
24871
|
oldLength--;
|
24799
24872
|
delete oldValue[key];
|
24800
24873
|
}
|
@@ -25879,7 +25952,7 @@ function $SceDelegateProvider() {
|
|
25879
25952
|
'Attempted to trust a value in invalid context. Context: {0}; Value: {1}',
|
25880
25953
|
type, trustedValue);
|
25881
25954
|
}
|
25882
|
-
if (trustedValue === null || trustedValue
|
25955
|
+
if (trustedValue === null || isUndefined(trustedValue) || trustedValue === '') {
|
25883
25956
|
return trustedValue;
|
25884
25957
|
}
|
25885
25958
|
// All the current contexts in SCE_CONTEXTS happen to be strings. In order to avoid trusting
|
@@ -25934,7 +26007,7 @@ function $SceDelegateProvider() {
|
|
25934
26007
|
* `$sceDelegate.trustAs`} if valid in this context. Otherwise, throws an exception.
|
25935
26008
|
*/
|
25936
26009
|
function getTrusted(type, maybeTrusted) {
|
25937
|
-
if (maybeTrusted === null || maybeTrusted
|
26010
|
+
if (maybeTrusted === null || isUndefined(maybeTrusted) || maybeTrusted === '') {
|
25938
26011
|
return maybeTrusted;
|
25939
26012
|
}
|
25940
26013
|
var constructor = (byType.hasOwnProperty(type) ? byType[type] : null);
|
@@ -27195,7 +27268,7 @@ function $$CookieReader($document) {
|
|
27195
27268
|
// the first value that is seen for a cookie is the most
|
27196
27269
|
// specific one. values for the same cookie name that
|
27197
27270
|
// follow are for less specific paths.
|
27198
|
-
if (lastCookies[name]
|
27271
|
+
if (isUndefined(lastCookies[name])) {
|
27199
27272
|
lastCookies[name] = safeDecodeURIComponent(cookie.substring(index + 1));
|
27200
27273
|
}
|
27201
27274
|
}
|
@@ -27843,6 +27916,7 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
27843
27916
|
if (fractionSize > 0 && number < 1) {
|
27844
27917
|
formatedText = number.toFixed(fractionSize);
|
27845
27918
|
number = parseFloat(formatedText);
|
27919
|
+
formatedText = formatedText.replace(DECIMAL_SEP, decimalSep);
|
27846
27920
|
}
|
27847
27921
|
}
|
27848
27922
|
|
@@ -29141,6 +29215,7 @@ function nullFormRenameControl(control, name) {
|
|
29141
29215
|
* @property {boolean} $dirty True if user has already interacted with the form.
|
29142
29216
|
* @property {boolean} $valid True if all of the containing forms and controls are valid.
|
29143
29217
|
* @property {boolean} $invalid True if at least one containing control or form is invalid.
|
29218
|
+
* @property {boolean} $pending True if at least one containing control or form is pending.
|
29144
29219
|
* @property {boolean} $submitted True if user has submitted the form even if its invalid.
|
29145
29220
|
*
|
29146
29221
|
* @property {Object} $error Is an object hash, containing references to controls or
|
@@ -29180,8 +29255,6 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29180
29255
|
var form = this,
|
29181
29256
|
controls = [];
|
29182
29257
|
|
29183
|
-
var parentForm = form.$$parentForm = element.parent().controller('form') || nullFormCtrl;
|
29184
|
-
|
29185
29258
|
// init state
|
29186
29259
|
form.$error = {};
|
29187
29260
|
form.$$success = {};
|
@@ -29192,8 +29265,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29192
29265
|
form.$valid = true;
|
29193
29266
|
form.$invalid = false;
|
29194
29267
|
form.$submitted = false;
|
29195
|
-
|
29196
|
-
parentForm.$addControl(form);
|
29268
|
+
form.$$parentForm = nullFormCtrl;
|
29197
29269
|
|
29198
29270
|
/**
|
29199
29271
|
* @ngdoc method
|
@@ -29232,11 +29304,23 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29232
29304
|
/**
|
29233
29305
|
* @ngdoc method
|
29234
29306
|
* @name form.FormController#$addControl
|
29307
|
+
* @param {object} control control object, either a {@link form.FormController} or an
|
29308
|
+
* {@link ngModel.NgModelController}
|
29235
29309
|
*
|
29236
29310
|
* @description
|
29237
|
-
* Register a control with the form.
|
29311
|
+
* Register a control with the form. Input elements using ngModelController do this automatically
|
29312
|
+
* when they are linked.
|
29238
29313
|
*
|
29239
|
-
*
|
29314
|
+
* Note that the current state of the control will not be reflected on the new parent form. This
|
29315
|
+
* is not an issue with normal use, as freshly compiled and linked controls are in a `$pristine`
|
29316
|
+
* state.
|
29317
|
+
*
|
29318
|
+
* However, if the method is used programmatically, for example by adding dynamically created controls,
|
29319
|
+
* or controls that have been previously removed without destroying their corresponding DOM element,
|
29320
|
+
* it's the developers responsiblity to make sure the current state propagates to the parent form.
|
29321
|
+
*
|
29322
|
+
* For example, if an input control is added that is already `$dirty` and has `$error` properties,
|
29323
|
+
* calling `$setDirty()` and `$validate()` afterwards will propagate the state to the parent form.
|
29240
29324
|
*/
|
29241
29325
|
form.$addControl = function(control) {
|
29242
29326
|
// Breaking change - before, inputs whose name was "hasOwnProperty" were quietly ignored
|
@@ -29247,6 +29331,8 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29247
29331
|
if (control.$name) {
|
29248
29332
|
form[control.$name] = control;
|
29249
29333
|
}
|
29334
|
+
|
29335
|
+
control.$$parentForm = form;
|
29250
29336
|
};
|
29251
29337
|
|
29252
29338
|
// Private API: rename a form control
|
@@ -29263,11 +29349,18 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29263
29349
|
/**
|
29264
29350
|
* @ngdoc method
|
29265
29351
|
* @name form.FormController#$removeControl
|
29352
|
+
* @param {object} control control object, either a {@link form.FormController} or an
|
29353
|
+
* {@link ngModel.NgModelController}
|
29266
29354
|
*
|
29267
29355
|
* @description
|
29268
29356
|
* Deregister a control from the form.
|
29269
29357
|
*
|
29270
29358
|
* Input elements using ngModelController do this automatically when they are destroyed.
|
29359
|
+
*
|
29360
|
+
* Note that only the removed control's validation state (`$errors`etc.) will be removed from the
|
29361
|
+
* form. `$dirty`, `$submitted` states will not be changed, because the expected behavior can be
|
29362
|
+
* different from case to case. For example, removing the only `$dirty` control from a form may or
|
29363
|
+
* may not mean that the form is still `$dirty`.
|
29271
29364
|
*/
|
29272
29365
|
form.$removeControl = function(control) {
|
29273
29366
|
if (control.$name && form[control.$name] === control) {
|
@@ -29284,6 +29377,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29284
29377
|
});
|
29285
29378
|
|
29286
29379
|
arrayRemove(controls, control);
|
29380
|
+
control.$$parentForm = nullFormCtrl;
|
29287
29381
|
};
|
29288
29382
|
|
29289
29383
|
|
@@ -29320,7 +29414,6 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29320
29414
|
delete object[property];
|
29321
29415
|
}
|
29322
29416
|
},
|
29323
|
-
parentForm: parentForm,
|
29324
29417
|
$animate: $animate
|
29325
29418
|
});
|
29326
29419
|
|
@@ -29339,7 +29432,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29339
29432
|
$animate.addClass(element, DIRTY_CLASS);
|
29340
29433
|
form.$dirty = true;
|
29341
29434
|
form.$pristine = false;
|
29342
|
-
parentForm.$setDirty();
|
29435
|
+
form.$$parentForm.$setDirty();
|
29343
29436
|
};
|
29344
29437
|
|
29345
29438
|
/**
|
@@ -29395,7 +29488,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29395
29488
|
form.$setSubmitted = function() {
|
29396
29489
|
$animate.addClass(element, SUBMITTED_CLASS);
|
29397
29490
|
form.$submitted = true;
|
29398
|
-
parentForm.$setSubmitted();
|
29491
|
+
form.$$parentForm.$setSubmitted();
|
29399
29492
|
};
|
29400
29493
|
}
|
29401
29494
|
|
@@ -29445,6 +29538,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29445
29538
|
* # CSS classes
|
29446
29539
|
* - `ng-valid` is set if the form is valid.
|
29447
29540
|
* - `ng-invalid` is set if the form is invalid.
|
29541
|
+
* - `ng-pending` is set if the form is pending.
|
29448
29542
|
* - `ng-pristine` is set if the form is pristine.
|
29449
29543
|
* - `ng-dirty` is set if the form is dirty.
|
29450
29544
|
* - `ng-submitted` is set if the form was submitted.
|
@@ -29520,7 +29614,6 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
29520
29614
|
</script>
|
29521
29615
|
<style>
|
29522
29616
|
.my-form {
|
29523
|
-
-webkit-transition:all linear 0.5s;
|
29524
29617
|
transition:all linear 0.5s;
|
29525
29618
|
background: transparent;
|
29526
29619
|
}
|
@@ -29569,6 +29662,7 @@ var formDirectiveFactory = function(isNgForm) {
|
|
29569
29662
|
var formDirective = {
|
29570
29663
|
name: 'form',
|
29571
29664
|
restrict: isNgForm ? 'EAC' : 'E',
|
29665
|
+
require: ['form', '^^?form'], //first is the form's own ctrl, second is an optional parent form
|
29572
29666
|
controller: FormController,
|
29573
29667
|
compile: function ngFormCompile(formElement, attr) {
|
29574
29668
|
// Setup initial state of the control
|
@@ -29577,7 +29671,9 @@ var formDirectiveFactory = function(isNgForm) {
|
|
29577
29671
|
var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);
|
29578
29672
|
|
29579
29673
|
return {
|
29580
|
-
pre: function ngFormPreLink(scope, formElement, attr,
|
29674
|
+
pre: function ngFormPreLink(scope, formElement, attr, ctrls) {
|
29675
|
+
var controller = ctrls[0];
|
29676
|
+
|
29581
29677
|
// if `action` attr is not present on the form, prevent the default action (submission)
|
29582
29678
|
if (!('action' in attr)) {
|
29583
29679
|
// we can't use jq events because if a form is destroyed during submission the default
|
@@ -29606,7 +29702,9 @@ var formDirectiveFactory = function(isNgForm) {
|
|
29606
29702
|
});
|
29607
29703
|
}
|
29608
29704
|
|
29609
|
-
var parentFormCtrl = controller.$$parentForm;
|
29705
|
+
var parentFormCtrl = ctrls[1] || controller.$$parentForm;
|
29706
|
+
parentFormCtrl.$addControl(controller);
|
29707
|
+
|
29610
29708
|
var setter = nameAttr ? getSetter(controller.$name) : noop;
|
29611
29709
|
|
29612
29710
|
if (nameAttr) {
|
@@ -29614,13 +29712,13 @@ var formDirectiveFactory = function(isNgForm) {
|
|
29614
29712
|
attr.$observe(nameAttr, function(newValue) {
|
29615
29713
|
if (controller.$name === newValue) return;
|
29616
29714
|
setter(scope, undefined);
|
29617
|
-
|
29715
|
+
controller.$$parentForm.$$renameControl(controller, newValue);
|
29618
29716
|
setter = getSetter(controller.$name);
|
29619
29717
|
setter(scope, controller);
|
29620
29718
|
});
|
29621
29719
|
}
|
29622
29720
|
formElement.on('$destroy', function() {
|
29623
|
-
|
29721
|
+
controller.$$parentForm.$removeControl(controller);
|
29624
29722
|
setter(scope, undefined);
|
29625
29723
|
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
|
29626
29724
|
});
|
@@ -29782,9 +29880,17 @@ var inputType = {
|
|
29782
29880
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
29783
29881
|
* @param {string=} name Property name of the form under which the control is published.
|
29784
29882
|
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`. This must be a
|
29785
|
-
*
|
29883
|
+
* valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute
|
29884
|
+
* (e.g. `min="{{minDate | date:'yyyy-MM-dd'}}"`). Note that `min` will also add native HTML5
|
29885
|
+
* constraint validation.
|
29786
29886
|
* @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`. This must be
|
29787
|
-
*
|
29887
|
+
* a valid ISO date string (yyyy-MM-dd). You can also use interpolation inside this attribute
|
29888
|
+
* (e.g. `max="{{maxDate | date:'yyyy-MM-dd'}}"`). Note that `max` will also add native HTML5
|
29889
|
+
* constraint validation.
|
29890
|
+
* @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO date string
|
29891
|
+
* the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.
|
29892
|
+
* @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO date string
|
29893
|
+
* the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.
|
29788
29894
|
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
29789
29895
|
* @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
|
29790
29896
|
* the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
|
@@ -29876,10 +29982,18 @@ var inputType = {
|
|
29876
29982
|
*
|
29877
29983
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
29878
29984
|
* @param {string=} name Property name of the form under which the control is published.
|
29879
|
-
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
29880
|
-
* valid ISO datetime format (yyyy-MM-ddTHH:mm:ss).
|
29881
|
-
*
|
29882
|
-
*
|
29985
|
+
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
29986
|
+
* This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation
|
29987
|
+
* inside this attribute (e.g. `min="{{minDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`).
|
29988
|
+
* Note that `min` will also add native HTML5 constraint validation.
|
29989
|
+
* @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
|
29990
|
+
* This must be a valid ISO datetime format (yyyy-MM-ddTHH:mm:ss). You can also use interpolation
|
29991
|
+
* inside this attribute (e.g. `max="{{maxDatetimeLocal | date:'yyyy-MM-ddTHH:mm:ss'}}"`).
|
29992
|
+
* Note that `max` will also add native HTML5 constraint validation.
|
29993
|
+
* @param {(date|string)=} ngMin Sets the `min` validation error key to the Date / ISO datetime string
|
29994
|
+
* the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.
|
29995
|
+
* @param {(date|string)=} ngMax Sets the `max` validation error key to the Date / ISO datetime string
|
29996
|
+
* the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.
|
29883
29997
|
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
29884
29998
|
* @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
|
29885
29999
|
* the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
|
@@ -29972,10 +30086,18 @@ var inputType = {
|
|
29972
30086
|
*
|
29973
30087
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
29974
30088
|
* @param {string=} name Property name of the form under which the control is published.
|
29975
|
-
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
29976
|
-
* valid ISO time format (HH:mm:ss).
|
29977
|
-
*
|
29978
|
-
*
|
30089
|
+
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
30090
|
+
* This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this
|
30091
|
+
* attribute (e.g. `min="{{minTime | date:'HH:mm:ss'}}"`). Note that `min` will also add
|
30092
|
+
* native HTML5 constraint validation.
|
30093
|
+
* @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
|
30094
|
+
* This must be a valid ISO time format (HH:mm:ss). You can also use interpolation inside this
|
30095
|
+
* attribute (e.g. `max="{{maxTime | date:'HH:mm:ss'}}"`). Note that `max` will also add
|
30096
|
+
* native HTML5 constraint validation.
|
30097
|
+
* @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO time string the
|
30098
|
+
* `ngMin` expression evaluates to. Note that it does not set the `min` attribute.
|
30099
|
+
* @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO time string the
|
30100
|
+
* `ngMax` expression evaluates to. Note that it does not set the `max` attribute.
|
29979
30101
|
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
29980
30102
|
* @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
|
29981
30103
|
* the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
|
@@ -30067,10 +30189,18 @@ var inputType = {
|
|
30067
30189
|
*
|
30068
30190
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
30069
30191
|
* @param {string=} name Property name of the form under which the control is published.
|
30070
|
-
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
30071
|
-
* valid ISO week format (yyyy-W##).
|
30072
|
-
*
|
30073
|
-
*
|
30192
|
+
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
30193
|
+
* This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this
|
30194
|
+
* attribute (e.g. `min="{{minWeek | date:'yyyy-Www'}}"`). Note that `min` will also add
|
30195
|
+
* native HTML5 constraint validation.
|
30196
|
+
* @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
|
30197
|
+
* This must be a valid ISO week format (yyyy-W##). You can also use interpolation inside this
|
30198
|
+
* attribute (e.g. `max="{{maxWeek | date:'yyyy-Www'}}"`). Note that `max` will also add
|
30199
|
+
* native HTML5 constraint validation.
|
30200
|
+
* @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string
|
30201
|
+
* the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.
|
30202
|
+
* @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string
|
30203
|
+
* the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.
|
30074
30204
|
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
30075
30205
|
* @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
|
30076
30206
|
* the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
|
@@ -30164,10 +30294,19 @@ var inputType = {
|
|
30164
30294
|
*
|
30165
30295
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
30166
30296
|
* @param {string=} name Property name of the form under which the control is published.
|
30167
|
-
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
30168
|
-
* a valid ISO month format (yyyy-MM).
|
30169
|
-
*
|
30170
|
-
*
|
30297
|
+
* @param {string=} min Sets the `min` validation error key if the value entered is less than `min`.
|
30298
|
+
* This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this
|
30299
|
+
* attribute (e.g. `min="{{minMonth | date:'yyyy-MM'}}"`). Note that `min` will also add
|
30300
|
+
* native HTML5 constraint validation.
|
30301
|
+
* @param {string=} max Sets the `max` validation error key if the value entered is greater than `max`.
|
30302
|
+
* This must be a valid ISO month format (yyyy-MM). You can also use interpolation inside this
|
30303
|
+
* attribute (e.g. `max="{{maxMonth | date:'yyyy-MM'}}"`). Note that `max` will also add
|
30304
|
+
* native HTML5 constraint validation.
|
30305
|
+
* @param {(date|string)=} ngMin Sets the `min` validation constraint to the Date / ISO week string
|
30306
|
+
* the `ngMin` expression evaluates to. Note that it does not set the `min` attribute.
|
30307
|
+
* @param {(date|string)=} ngMax Sets the `max` validation constraint to the Date / ISO week string
|
30308
|
+
* the `ngMax` expression evaluates to. Note that it does not set the `max` attribute.
|
30309
|
+
|
30171
30310
|
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
30172
30311
|
* @param {string=} ngRequired Adds `required` attribute and `required` validation constraint to
|
30173
30312
|
* the element when the ngRequired expression evaluates to true. Use `ngRequired` instead of
|
@@ -30929,7 +31068,7 @@ function createDateInputType(type, regexp, parseDate, format) {
|
|
30929
31068
|
}
|
30930
31069
|
|
30931
31070
|
function parseObservedDateValue(val) {
|
30932
|
-
return isDefined(val)
|
31071
|
+
return isDefined(val) && !isDate(val) ? parseDate(val) || undefined : val;
|
30933
31072
|
}
|
30934
31073
|
};
|
30935
31074
|
}
|
@@ -31424,7 +31563,7 @@ var ngBindDirective = ['$compile', function($compile) {
|
|
31424
31563
|
$compile.$$addBindingInfo(element, attr.ngBind);
|
31425
31564
|
element = element[0];
|
31426
31565
|
scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
|
31427
|
-
element.textContent = value
|
31566
|
+
element.textContent = isUndefined(value) ? '' : value;
|
31428
31567
|
});
|
31429
31568
|
};
|
31430
31569
|
}
|
@@ -31492,7 +31631,7 @@ var ngBindTemplateDirective = ['$interpolate', '$compile', function($interpolate
|
|
31492
31631
|
$compile.$$addBindingInfo(element, interpolateFn.expressions);
|
31493
31632
|
element = element[0];
|
31494
31633
|
attr.$observe('ngBindTemplate', function(value) {
|
31495
|
-
element.textContent = value
|
31634
|
+
element.textContent = isUndefined(value) ? '' : value;
|
31496
31635
|
});
|
31497
31636
|
};
|
31498
31637
|
}
|
@@ -31909,7 +32048,6 @@ function classDirective(name, selector) {
|
|
31909
32048
|
</file>
|
31910
32049
|
<file name="style.css">
|
31911
32050
|
.base-class {
|
31912
|
-
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
31913
32051
|
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
31914
32052
|
}
|
31915
32053
|
|
@@ -33084,7 +33222,6 @@ forEach(
|
|
33084
33222
|
}
|
33085
33223
|
|
33086
33224
|
.animate-if.ng-enter, .animate-if.ng-leave {
|
33087
|
-
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
33088
33225
|
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
33089
33226
|
}
|
33090
33227
|
|
@@ -33233,7 +33370,6 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
33233
33370
|
}
|
33234
33371
|
|
33235
33372
|
.slide-animate.ng-enter, .slide-animate.ng-leave {
|
33236
|
-
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
33237
33373
|
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
33238
33374
|
|
33239
33375
|
position:absolute;
|
@@ -33452,16 +33588,18 @@ var ngIncludeFillContentDirective = ['$compile',
|
|
33452
33588
|
* current scope.
|
33453
33589
|
*
|
33454
33590
|
* <div class="alert alert-danger">
|
33455
|
-
*
|
33456
|
-
*
|
33457
|
-
*
|
33458
|
-
*
|
33591
|
+
* This directive can be abused to add unnecessary amounts of logic into your templates.
|
33592
|
+
* There are only a few appropriate uses of `ngInit`, such as for aliasing special properties of
|
33593
|
+
* {@link ng.directive:ngRepeat `ngRepeat`}, as seen in the demo below; and for injecting data via
|
33594
|
+
* server side scripting. Besides these few cases, you should use {@link guide/controller controllers}
|
33595
|
+
* rather than `ngInit` to initialize values on a scope.
|
33459
33596
|
* </div>
|
33597
|
+
*
|
33460
33598
|
* <div class="alert alert-warning">
|
33461
|
-
* **Note**: If you have assignment in `ngInit` along with {@link ng.$filter
|
33462
|
-
* sure you have
|
33599
|
+
* **Note**: If you have assignment in `ngInit` along with a {@link ng.$filter `filter`}, make
|
33600
|
+
* sure you have parentheses to ensure correct operator precedence:
|
33463
33601
|
* <pre class="prettyprint">
|
33464
|
-
* `<div ng-init="test1 = (
|
33602
|
+
* `<div ng-init="test1 = ($index | toString)"></div>`
|
33465
33603
|
* </pre>
|
33466
33604
|
* </div>
|
33467
33605
|
*
|
@@ -33574,7 +33712,7 @@ var ngInitDirective = ngDirective({
|
|
33574
33712
|
* </file>
|
33575
33713
|
* </example>
|
33576
33714
|
*
|
33577
|
-
* ### Example - splitting on
|
33715
|
+
* ### Example - splitting on newline
|
33578
33716
|
* <example name="ngList-directive-newlines">
|
33579
33717
|
* <file name="index.html">
|
33580
33718
|
* <textarea ng-model="list" ng-list=" " ng-trim="false"></textarea>
|
@@ -33659,7 +33797,9 @@ var ngModelMinErr = minErr('ngModel');
|
|
33659
33797
|
* @ngdoc type
|
33660
33798
|
* @name ngModel.NgModelController
|
33661
33799
|
*
|
33662
|
-
* @property {
|
33800
|
+
* @property {*} $viewValue The actual value from the control's view. For `input` elements, this is a
|
33801
|
+
* String. See {@link ngModel.NgModelController#$setViewValue} for information about when the $viewValue
|
33802
|
+
* is set.
|
33663
33803
|
* @property {*} $modelValue The value in the model that the control is bound to.
|
33664
33804
|
* @property {Array.<Function>} $parsers Array of functions to execute, as a pipeline, whenever
|
33665
33805
|
the control reads value from the DOM. The functions are called in array order, each passing
|
@@ -33873,7 +34013,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
33873
34013
|
this.$$success = {}; // keep valid keys here
|
33874
34014
|
this.$pending = undefined; // keep pending keys here
|
33875
34015
|
this.$name = $interpolate($attr.name || '', false)($scope);
|
33876
|
-
|
34016
|
+
this.$$parentForm = nullFormCtrl;
|
33877
34017
|
|
33878
34018
|
var parsedNgModel = $parse($attr.ngModel),
|
33879
34019
|
parsedNgModelAssign = parsedNgModel.assign,
|
@@ -33953,8 +34093,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
33953
34093
|
return isUndefined(value) || value === '' || value === null || value !== value;
|
33954
34094
|
};
|
33955
34095
|
|
33956
|
-
var
|
33957
|
-
currentValidationRunId = 0;
|
34096
|
+
var currentValidationRunId = 0;
|
33958
34097
|
|
33959
34098
|
/**
|
33960
34099
|
* @ngdoc method
|
@@ -33987,7 +34126,6 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
33987
34126
|
unset: function(object, property) {
|
33988
34127
|
delete object[property];
|
33989
34128
|
},
|
33990
|
-
parentForm: parentForm,
|
33991
34129
|
$animate: $animate
|
33992
34130
|
});
|
33993
34131
|
|
@@ -34025,7 +34163,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
34025
34163
|
ctrl.$pristine = false;
|
34026
34164
|
$animate.removeClass($element, PRISTINE_CLASS);
|
34027
34165
|
$animate.addClass($element, DIRTY_CLASS);
|
34028
|
-
parentForm.$setDirty();
|
34166
|
+
ctrl.$$parentForm.$setDirty();
|
34029
34167
|
};
|
34030
34168
|
|
34031
34169
|
/**
|
@@ -34195,7 +34333,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
34195
34333
|
|
34196
34334
|
function processParseErrors() {
|
34197
34335
|
var errorKey = ctrl.$$parserName || 'parse';
|
34198
|
-
if (parserValid
|
34336
|
+
if (isUndefined(parserValid)) {
|
34199
34337
|
setValidity(errorKey, null);
|
34200
34338
|
} else {
|
34201
34339
|
if (!parserValid) {
|
@@ -34365,37 +34503,47 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
34365
34503
|
* @description
|
34366
34504
|
* Update the view value.
|
34367
34505
|
*
|
34368
|
-
* This method should be called when
|
34369
|
-
* this is done from within a DOM event handler.
|
34370
|
-
*
|
34371
|
-
*
|
34372
|
-
* {@link ng.directive:select select} calls it when an option is selected.
|
34373
|
-
*
|
34374
|
-
* If the new `value` is an object (rather than a string or a number), we should make a copy of the
|
34375
|
-
* object before passing it to `$setViewValue`. This is because `ngModel` does not perform a deep
|
34376
|
-
* watch of objects, it only looks for a change of identity. If you only change the property of
|
34377
|
-
* the object then ngModel will not realise that the object has changed and will not invoke the
|
34378
|
-
* `$parsers` and `$validators` pipelines.
|
34379
|
-
*
|
34380
|
-
* For this reason, you should not change properties of the copy once it has been passed to
|
34381
|
-
* `$setViewValue`. Otherwise you may cause the model value on the scope to change incorrectly.
|
34506
|
+
* This method should be called when a control wants to change the view value; typically,
|
34507
|
+
* this is done from within a DOM event handler. For example, the {@link ng.directive:input input}
|
34508
|
+
* directive calls it when the value of the input changes and {@link ng.directive:select select}
|
34509
|
+
* calls it when an option is selected.
|
34382
34510
|
*
|
34383
|
-
* When
|
34511
|
+
* When `$setViewValue` is called, the new `value` will be staged for committing through the `$parsers`
|
34384
34512
|
* and `$validators` pipelines. If there are no special {@link ngModelOptions} specified then the staged
|
34385
34513
|
* value sent directly for processing, finally to be applied to `$modelValue` and then the
|
34386
|
-
* **expression** specified in the `ng-model` attribute.
|
34387
|
-
*
|
34388
|
-
* Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
|
34514
|
+
* **expression** specified in the `ng-model` attribute. Lastly, all the registered change listeners,
|
34515
|
+
* in the `$viewChangeListeners` list, are called.
|
34389
34516
|
*
|
34390
34517
|
* In case the {@link ng.directive:ngModelOptions ngModelOptions} directive is used with `updateOn`
|
34391
34518
|
* and the `default` trigger is not listed, all those actions will remain pending until one of the
|
34392
34519
|
* `updateOn` events is triggered on the DOM element.
|
34393
34520
|
* All these actions will be debounced if the {@link ng.directive:ngModelOptions ngModelOptions}
|
34394
34521
|
* directive is used with a custom debounce for this particular event.
|
34522
|
+
* Note that a `$digest` is only triggered once the `updateOn` events are fired, or if `debounce`
|
34523
|
+
* is specified, once the timer runs out.
|
34524
|
+
*
|
34525
|
+
* When used with standard inputs, the view value will always be a string (which is in some cases
|
34526
|
+
* parsed into another type, such as a `Date` object for `input[date]`.)
|
34527
|
+
* However, custom controls might also pass objects to this method. In this case, we should make
|
34528
|
+
* a copy of the object before passing it to `$setViewValue`. This is because `ngModel` does not
|
34529
|
+
* perform a deep watch of objects, it only looks for a change of identity. If you only change
|
34530
|
+
* the property of the object then ngModel will not realise that the object has changed and
|
34531
|
+
* will not invoke the `$parsers` and `$validators` pipelines. For this reason, you should
|
34532
|
+
* not change properties of the copy once it has been passed to `$setViewValue`.
|
34533
|
+
* Otherwise you may cause the model value on the scope to change incorrectly.
|
34534
|
+
*
|
34535
|
+
* <div class="alert alert-info">
|
34536
|
+
* In any case, the value passed to the method should always reflect the current value
|
34537
|
+
* of the control. For example, if you are calling `$setViewValue` for an input element,
|
34538
|
+
* you should pass the input DOM value. Otherwise, the control and the scope model become
|
34539
|
+
* out of sync. It's also important to note that `$setViewValue` does not call `$render` or change
|
34540
|
+
* the control's DOM value in any way. If we want to change the control's DOM value
|
34541
|
+
* programmatically, we should update the `ngModel` scope expression. Its new value will be
|
34542
|
+
* picked up by the model controller, which will run it through the `$formatters`, `$render` it
|
34543
|
+
* to update the DOM, and finally call `$validate` on it.
|
34544
|
+
* </div>
|
34395
34545
|
*
|
34396
|
-
*
|
34397
|
-
*
|
34398
|
-
* @param {string} value Value from the view.
|
34546
|
+
* @param {*} value value from the view.
|
34399
34547
|
* @param {string} trigger Event that triggered the update.
|
34400
34548
|
*/
|
34401
34549
|
this.$setViewValue = function(value, trigger) {
|
@@ -34572,7 +34720,6 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
34572
34720
|
</script>
|
34573
34721
|
<style>
|
34574
34722
|
.my-input {
|
34575
|
-
-webkit-transition:all linear 0.5s;
|
34576
34723
|
transition:all linear 0.5s;
|
34577
34724
|
background: transparent;
|
34578
34725
|
}
|
@@ -34659,7 +34806,7 @@ var ngModelDirective = ['$rootScope', function($rootScope) {
|
|
34659
34806
|
return {
|
34660
34807
|
pre: function ngModelPreLink(scope, element, attr, ctrls) {
|
34661
34808
|
var modelCtrl = ctrls[0],
|
34662
|
-
formCtrl = ctrls[1] ||
|
34809
|
+
formCtrl = ctrls[1] || modelCtrl.$$parentForm;
|
34663
34810
|
|
34664
34811
|
modelCtrl.$$setOptions(ctrls[2] && ctrls[2].$options);
|
34665
34812
|
|
@@ -34668,12 +34815,12 @@ var ngModelDirective = ['$rootScope', function($rootScope) {
|
|
34668
34815
|
|
34669
34816
|
attr.$observe('name', function(newValue) {
|
34670
34817
|
if (modelCtrl.$name !== newValue) {
|
34671
|
-
|
34818
|
+
modelCtrl.$$parentForm.$$renameControl(modelCtrl, newValue);
|
34672
34819
|
}
|
34673
34820
|
});
|
34674
34821
|
|
34675
34822
|
scope.$on('$destroy', function() {
|
34676
|
-
|
34823
|
+
modelCtrl.$$parentForm.$removeControl(modelCtrl);
|
34677
34824
|
});
|
34678
34825
|
},
|
34679
34826
|
post: function ngModelPostLink(scope, element, attr, ctrls) {
|
@@ -34868,7 +35015,7 @@ var ngModelOptionsDirective = function() {
|
|
34868
35015
|
var that = this;
|
34869
35016
|
this.$options = copy($scope.$eval($attrs.ngModelOptions));
|
34870
35017
|
// Allow adding/overriding bound events
|
34871
|
-
if (this.$options.updateOn
|
35018
|
+
if (isDefined(this.$options.updateOn)) {
|
34872
35019
|
this.$options.updateOnDefault = false;
|
34873
35020
|
// extract "default" pseudo-event from list of events that can trigger a model update
|
34874
35021
|
this.$options.updateOn = trim(this.$options.updateOn.replace(DEFAULT_REGEXP, function() {
|
@@ -34891,7 +35038,6 @@ function addSetValidityMethod(context) {
|
|
34891
35038
|
classCache = {},
|
34892
35039
|
set = context.set,
|
34893
35040
|
unset = context.unset,
|
34894
|
-
parentForm = context.parentForm,
|
34895
35041
|
$animate = context.$animate;
|
34896
35042
|
|
34897
35043
|
classCache[INVALID_CLASS] = !(classCache[VALID_CLASS] = $element.hasClass(VALID_CLASS));
|
@@ -34899,7 +35045,7 @@ function addSetValidityMethod(context) {
|
|
34899
35045
|
ctrl.$setValidity = setValidity;
|
34900
35046
|
|
34901
35047
|
function setValidity(validationErrorKey, state, controller) {
|
34902
|
-
if (state
|
35048
|
+
if (isUndefined(state)) {
|
34903
35049
|
createAndSet('$pending', validationErrorKey, controller);
|
34904
35050
|
} else {
|
34905
35051
|
unsetAndCleanup('$pending', validationErrorKey, controller);
|
@@ -34943,7 +35089,7 @@ function addSetValidityMethod(context) {
|
|
34943
35089
|
}
|
34944
35090
|
|
34945
35091
|
toggleValidationCss(validationErrorKey, combinedState);
|
34946
|
-
parentForm.$setValidity(validationErrorKey, combinedState, ctrl);
|
35092
|
+
ctrl.$$parentForm.$setValidity(validationErrorKey, combinedState, ctrl);
|
34947
35093
|
}
|
34948
35094
|
|
34949
35095
|
function createAndSet(name, value, controller) {
|
@@ -35604,11 +35750,16 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35604
35750
|
function updateOptionElement(option, element) {
|
35605
35751
|
option.element = element;
|
35606
35752
|
element.disabled = option.disabled;
|
35607
|
-
|
35753
|
+
// NOTE: The label must be set before the value, otherwise IE10/11/EDGE create unresponsive
|
35754
|
+
// selects in certain circumstances when multiple selects are next to each other and display
|
35755
|
+
// the option list in listbox style, i.e. the select is [multiple], or specifies a [size].
|
35756
|
+
// See https://github.com/angular/angular.js/issues/11314 for more info.
|
35757
|
+
// This is unfortunately untestable with unit / e2e tests
|
35608
35758
|
if (option.label !== element.label) {
|
35609
35759
|
element.label = option.label;
|
35610
35760
|
element.textContent = option.label;
|
35611
35761
|
}
|
35762
|
+
if (option.value !== element.value) element.value = option.selectValue;
|
35612
35763
|
}
|
35613
35764
|
|
35614
35765
|
function addOrReuseElement(parent, current, type, templateElement) {
|
@@ -35649,7 +35800,10 @@ var ngOptionsDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
35649
35800
|
if (emptyOption_ || unknownOption_) {
|
35650
35801
|
while (current &&
|
35651
35802
|
(current === emptyOption_ ||
|
35652
|
-
current === unknownOption_
|
35803
|
+
current === unknownOption_ ||
|
35804
|
+
emptyOption_ && emptyOption_.nodeType === NODE_TYPE_COMMENT)) {
|
35805
|
+
// Empty options might have directives that transclude
|
35806
|
+
// and insert comments (e.g. ngIf)
|
35653
35807
|
current = current.nextSibling;
|
35654
35808
|
}
|
35655
35809
|
}
|
@@ -36011,8 +36165,10 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
36011
36165
|
* | `$even` | {@type boolean} | true if the iterator position `$index` is even (otherwise false). |
|
36012
36166
|
* | `$odd` | {@type boolean} | true if the iterator position `$index` is odd (otherwise false). |
|
36013
36167
|
*
|
36014
|
-
*
|
36015
|
-
*
|
36168
|
+
* <div class="alert alert-info">
|
36169
|
+
* Creating aliases for these properties is possible with {@link ng.directive:ngInit `ngInit`}.
|
36170
|
+
* This may be useful when, for instance, nesting ngRepeats.
|
36171
|
+
* </div>
|
36016
36172
|
*
|
36017
36173
|
*
|
36018
36174
|
* # Iterating over object properties
|
@@ -36246,7 +36402,6 @@ var ngPluralizeDirective = ['$locale', '$interpolate', '$log', function($locale,
|
|
36246
36402
|
.animate-repeat.ng-move,
|
36247
36403
|
.animate-repeat.ng-enter,
|
36248
36404
|
.animate-repeat.ng-leave {
|
36249
|
-
-webkit-transition:all linear 0.5s;
|
36250
36405
|
transition:all linear 0.5s;
|
36251
36406
|
}
|
36252
36407
|
|
@@ -36418,7 +36573,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
36418
36573
|
// if object, extract keys, in enumeration order, unsorted
|
36419
36574
|
collectionKeys = [];
|
36420
36575
|
for (var itemKey in collection) {
|
36421
|
-
if (
|
36576
|
+
if (hasOwnProperty.call(collection, itemKey) && itemKey.charAt(0) !== '$') {
|
36422
36577
|
collectionKeys.push(itemKey);
|
36423
36578
|
}
|
36424
36579
|
}
|
@@ -36643,9 +36798,7 @@ var NG_HIDE_IN_PROGRESS_CLASS = 'ng-hide-animate';
|
|
36643
36798
|
background: white;
|
36644
36799
|
}
|
36645
36800
|
|
36646
|
-
.animate-show.ng-hide-add.ng-hide-
|
36647
|
-
.animate-show.ng-hide-remove.ng-hide-remove-active {
|
36648
|
-
-webkit-transition: all linear 0.5s;
|
36801
|
+
.animate-show.ng-hide-add, .animate-show.ng-hide-remove {
|
36649
36802
|
transition: all linear 0.5s;
|
36650
36803
|
}
|
36651
36804
|
|
@@ -36802,7 +36955,6 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
36802
36955
|
</file>
|
36803
36956
|
<file name="animations.css">
|
36804
36957
|
.animate-hide {
|
36805
|
-
-webkit-transition: all linear 0.5s;
|
36806
36958
|
transition: all linear 0.5s;
|
36807
36959
|
line-height: 20px;
|
36808
36960
|
opacity: 1;
|
@@ -37001,7 +37153,6 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
37001
37153
|
}
|
37002
37154
|
|
37003
37155
|
.animate-switch.ng-animate {
|
37004
|
-
-webkit-transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
37005
37156
|
transition:all cubic-bezier(0.250, 0.460, 0.450, 0.940) 0.5s;
|
37006
37157
|
|
37007
37158
|
position:absolute;
|
@@ -37342,31 +37493,162 @@ var SelectController =
|
|
37342
37493
|
* @description
|
37343
37494
|
* HTML `SELECT` element with angular data-binding.
|
37344
37495
|
*
|
37345
|
-
*
|
37346
|
-
*
|
37347
|
-
*
|
37348
|
-
*
|
37349
|
-
* comprehension expression.
|
37496
|
+
* The `select` directive is used together with {@link ngModel `ngModel`} to provide data-binding
|
37497
|
+
* between the scope and the `<select>` control (including setting default values).
|
37498
|
+
* Ìt also handles dynamic `<option>` elements, which can be added using the {@link ngRepeat `ngRepeat}` or
|
37499
|
+
* {@link ngOptions `ngOptions`} directives.
|
37350
37500
|
*
|
37351
|
-
* When an item in the `<select>` menu is selected, the
|
37352
|
-
*
|
37353
|
-
*
|
37501
|
+
* When an item in the `<select>` menu is selected, the value of the selected option will be bound
|
37502
|
+
* to the model identified by the `ngModel` directive. With static or repeated options, this is
|
37503
|
+
* the content of the `value` attribute or the textContent of the `<option>`, if the value attribute is missing.
|
37504
|
+
* If you want dynamic value attributes, you can use interpolation inside the value attribute.
|
37354
37505
|
*
|
37355
|
-
*
|
37356
|
-
*
|
37506
|
+
* <div class="alert alert-warning">
|
37507
|
+
* Note that the value of a `select` directive used without `ngOptions` is always a string.
|
37508
|
+
* When the model needs to be bound to a non-string value, you must either explictly convert it
|
37509
|
+
* using a directive (see example below) or use `ngOptions` to specify the set of options.
|
37510
|
+
* This is because an option element can only be bound to string values at present.
|
37511
|
+
* </div>
|
37512
|
+
*
|
37513
|
+
* If the viewValue of `ngModel` does not match any of the options, then the control
|
37514
|
+
* will automatically add an "unknown" option, which it then removes when the mismatch is resolved.
|
37357
37515
|
*
|
37358
37516
|
* Optionally, a single hard-coded `<option>` element, with the value set to an empty string, can
|
37359
37517
|
* be nested into the `<select>` element. This element will then represent the `null` or "not selected"
|
37360
37518
|
* option. See example below for demonstration.
|
37361
37519
|
*
|
37362
37520
|
* <div class="alert alert-info">
|
37363
|
-
*
|
37364
|
-
*
|
37365
|
-
*
|
37366
|
-
*
|
37521
|
+
* In many cases, `ngRepeat` can be used on `<option>` elements instead of {@link ng.directive:ngOptions
|
37522
|
+
* ngOptions} to achieve a similar result. However, `ngOptions` provides some benefits, such as
|
37523
|
+
* more flexibility in how the `<select>`'s model is assigned via the `select` **`as`** part of the
|
37524
|
+
* comprehension expression, and additionally in reducing memory and increasing speed by not creating
|
37525
|
+
* a new scope for each repeated instance.
|
37526
|
+
* </div>
|
37527
|
+
*
|
37528
|
+
*
|
37529
|
+
* @param {string} ngModel Assignable angular expression to data-bind to.
|
37530
|
+
* @param {string=} name Property name of the form under which the control is published.
|
37531
|
+
* @param {string=} required Sets `required` validation error key if the value is not entered.
|
37532
|
+
* @param {string=} ngRequired Adds required attribute and required validation constraint to
|
37533
|
+
* the element when the ngRequired expression evaluates to true. Use ngRequired instead of required
|
37534
|
+
* when you want to data-bind to the required attribute.
|
37535
|
+
* @param {string=} ngChange Angular expression to be executed when selected option(s) changes due to user
|
37536
|
+
* interaction with the select element.
|
37537
|
+
* @param {string=} ngOptions sets the options that the select is populated with and defines what is
|
37538
|
+
* set on the model on selection. See {@link ngOptions `ngOptions`}.
|
37539
|
+
*
|
37540
|
+
* @example
|
37541
|
+
* ### Simple `select` elements with static options
|
37542
|
+
*
|
37543
|
+
* <example name="static-select" module="staticSelect">
|
37544
|
+
* <file name="index.html">
|
37545
|
+
* <div ng-controller="ExampleController">
|
37546
|
+
* <form name="myForm">
|
37547
|
+
* <label for="singleSelect"> Single select: </label><br>
|
37548
|
+
* <select name="singleSelect" ng-model="data.singleSelect">
|
37549
|
+
* <option value="option-1">Option 1</option>
|
37550
|
+
* <option value="option-2">Option 2</option>
|
37551
|
+
* </select><br>
|
37552
|
+
*
|
37553
|
+
* <label for="singleSelect"> Single select with "not selected" option and dynamic option values: </label><br>
|
37554
|
+
* <select name="singleSelect" id="singleSelect" ng-model="data.singleSelect">
|
37555
|
+
* <option value="">---Please select---</option> <!-- not selected / blank option -->
|
37556
|
+
* <option value="{{data.option1}}">Option 1</option> <!-- interpolation -->
|
37557
|
+
* <option value="option-2">Option 2</option>
|
37558
|
+
* </select><br>
|
37559
|
+
* <button ng-click="forceUnknownOption()">Force unknown option</button><br>
|
37560
|
+
* <tt>singleSelect = {{data.singleSelect}}</tt>
|
37561
|
+
*
|
37562
|
+
* <hr>
|
37563
|
+
* <label for="multipleSelect"> Multiple select: </label><br>
|
37564
|
+
* <select name="multipleSelect" id="multipleSelect" ng-model="data.multipleSelect" multiple>
|
37565
|
+
* <option value="option-1">Option 1</option>
|
37566
|
+
* <option value="option-2">Option 2</option>
|
37567
|
+
* <option value="option-3">Option 3</option>
|
37568
|
+
* </select><br>
|
37569
|
+
* <tt>multipleSelect = {{data.multipleSelect}}</tt><br/>
|
37570
|
+
* </form>
|
37571
|
+
* </div>
|
37572
|
+
* </file>
|
37573
|
+
* <file name="app.js">
|
37574
|
+
* angular.module('staticSelect', [])
|
37575
|
+
* .controller('ExampleController', ['$scope', function($scope) {
|
37576
|
+
* $scope.data = {
|
37577
|
+
* singleSelect: null,
|
37578
|
+
* multipleSelect: [],
|
37579
|
+
* option1: 'option-1',
|
37580
|
+
* };
|
37581
|
+
*
|
37582
|
+
* $scope.forceUnknownOption = function() {
|
37583
|
+
* $scope.data.singleSelect = 'nonsense';
|
37584
|
+
* };
|
37585
|
+
* }]);
|
37586
|
+
* </file>
|
37587
|
+
*</example>
|
37588
|
+
*
|
37589
|
+
* ### Using `ngRepeat` to generate `select` options
|
37590
|
+
* <example name="ngrepeat-select" module="ngrepeatSelect">
|
37591
|
+
* <file name="index.html">
|
37592
|
+
* <div ng-controller="ExampleController">
|
37593
|
+
* <form name="myForm">
|
37594
|
+
* <label for="repeatSelect"> Repeat select: </label>
|
37595
|
+
* <select name="repeatSelect" id="repeatSelect" ng-model="data.repeatSelect">
|
37596
|
+
* <option ng-repeat="option in data.availableOptions" value="{{option.id}}">{{option.name}}</option>
|
37597
|
+
* </select>
|
37598
|
+
* </form>
|
37599
|
+
* <hr>
|
37600
|
+
* <tt>repeatSelect = {{data.repeatSelect}}</tt><br/>
|
37367
37601
|
* </div>
|
37602
|
+
* </file>
|
37603
|
+
* <file name="app.js">
|
37604
|
+
* angular.module('ngrepeatSelect', [])
|
37605
|
+
* .controller('ExampleController', ['$scope', function($scope) {
|
37606
|
+
* $scope.data = {
|
37607
|
+
* repeatSelect: null,
|
37608
|
+
* availableOptions: [
|
37609
|
+
* {id: '1', name: 'Option A'},
|
37610
|
+
* {id: '2', name: 'Option B'},
|
37611
|
+
* {id: '3', name: 'Option C'}
|
37612
|
+
* ],
|
37613
|
+
* };
|
37614
|
+
* }]);
|
37615
|
+
* </file>
|
37616
|
+
*</example>
|
37368
37617
|
*
|
37369
|
-
*
|
37618
|
+
*
|
37619
|
+
* ### Using `select` with `ngOptions` and setting a default value
|
37620
|
+
* See the {@link ngOptions ngOptions documentation} for more `ngOptions` usage examples.
|
37621
|
+
*
|
37622
|
+
* <example name="select-with-default-values" module="defaultValueSelect">
|
37623
|
+
* <file name="index.html">
|
37624
|
+
* <div ng-controller="ExampleController">
|
37625
|
+
* <form name="myForm">
|
37626
|
+
* <label for="mySelect">Make a choice:</label>
|
37627
|
+
* <select name="mySelect" id="mySelect"
|
37628
|
+
* ng-options="option.name for option in data.availableOptions track by option.id"
|
37629
|
+
* ng-model="data.selectedOption"></select>
|
37630
|
+
* </form>
|
37631
|
+
* <hr>
|
37632
|
+
* <tt>option = {{data.selectedOption}}</tt><br/>
|
37633
|
+
* </div>
|
37634
|
+
* </file>
|
37635
|
+
* <file name="app.js">
|
37636
|
+
* angular.module('defaultValueSelect', [])
|
37637
|
+
* .controller('ExampleController', ['$scope', function($scope) {
|
37638
|
+
* $scope.data = {
|
37639
|
+
* availableOptions: [
|
37640
|
+
* {id: '1', name: 'Option A'},
|
37641
|
+
* {id: '2', name: 'Option B'},
|
37642
|
+
* {id: '3', name: 'Option C'}
|
37643
|
+
* ],
|
37644
|
+
* selectedOption: {id: '3', name: 'Option C'} //This sets the default value of the select in the ui
|
37645
|
+
* };
|
37646
|
+
* }]);
|
37647
|
+
* </file>
|
37648
|
+
*</example>
|
37649
|
+
*
|
37650
|
+
*
|
37651
|
+
* ### Binding `select` to a non-string value via `ngModel` parsing / formatting
|
37370
37652
|
*
|
37371
37653
|
* <example name="select-with-non-string-options" module="nonStringSelect">
|
37372
37654
|
* <file name="index.html">
|
@@ -37504,9 +37786,12 @@ var optionDirective = ['$interpolate', function($interpolate) {
|
|
37504
37786
|
priority: 100,
|
37505
37787
|
compile: function(element, attr) {
|
37506
37788
|
|
37507
|
-
|
37508
|
-
|
37509
|
-
|
37789
|
+
if (isDefined(attr.value)) {
|
37790
|
+
// If the value attribute is defined, check if it contains an interpolation
|
37791
|
+
var valueInterpolated = $interpolate(attr.value, true);
|
37792
|
+
} else {
|
37793
|
+
// If the value attribute is not defined then we fall back to the
|
37794
|
+
// text content of the option element, which may be interpolated
|
37510
37795
|
var interpolateFn = $interpolate(element.text(), true);
|
37511
37796
|
if (!interpolateFn) {
|
37512
37797
|
attr.$set('value', element.text());
|
@@ -37522,24 +37807,38 @@ var optionDirective = ['$interpolate', function($interpolate) {
|
|
37522
37807
|
selectCtrl = parent.data(selectCtrlName) ||
|
37523
37808
|
parent.parent().data(selectCtrlName); // in case we are in optgroup
|
37524
37809
|
|
37810
|
+
function addOption(optionValue) {
|
37811
|
+
selectCtrl.addOption(optionValue, element);
|
37812
|
+
selectCtrl.ngModelCtrl.$render();
|
37813
|
+
chromeHack(element);
|
37814
|
+
}
|
37815
|
+
|
37525
37816
|
// Only update trigger option updates if this is an option within a `select`
|
37526
37817
|
// that also has `ngModel` attached
|
37527
37818
|
if (selectCtrl && selectCtrl.ngModelCtrl) {
|
37528
37819
|
|
37529
|
-
if (
|
37820
|
+
if (valueInterpolated) {
|
37821
|
+
// The value attribute is interpolated
|
37822
|
+
var oldVal;
|
37823
|
+
attr.$observe('value', function valueAttributeObserveAction(newVal) {
|
37824
|
+
if (isDefined(oldVal)) {
|
37825
|
+
selectCtrl.removeOption(oldVal);
|
37826
|
+
}
|
37827
|
+
oldVal = newVal;
|
37828
|
+
addOption(newVal);
|
37829
|
+
});
|
37830
|
+
} else if (interpolateFn) {
|
37831
|
+
// The text content is interpolated
|
37530
37832
|
scope.$watch(interpolateFn, function interpolateWatchAction(newVal, oldVal) {
|
37531
37833
|
attr.$set('value', newVal);
|
37532
37834
|
if (oldVal !== newVal) {
|
37533
37835
|
selectCtrl.removeOption(oldVal);
|
37534
37836
|
}
|
37535
|
-
|
37536
|
-
selectCtrl.ngModelCtrl.$render();
|
37537
|
-
chromeHack(element);
|
37837
|
+
addOption(newVal);
|
37538
37838
|
});
|
37539
37839
|
} else {
|
37540
|
-
|
37541
|
-
|
37542
|
-
chromeHack(element);
|
37840
|
+
// The value attribute is static
|
37841
|
+
addOption(attr.value);
|
37543
37842
|
}
|
37544
37843
|
|
37545
37844
|
element.on('$destroy', function() {
|
@@ -37600,8 +37899,9 @@ var patternDirective = function() {
|
|
37600
37899
|
ctrl.$validate();
|
37601
37900
|
});
|
37602
37901
|
|
37603
|
-
ctrl.$validators.pattern = function(
|
37604
|
-
|
37902
|
+
ctrl.$validators.pattern = function(modelValue, viewValue) {
|
37903
|
+
// HTML5 pattern constraint validates the input value, so we validate the viewValue
|
37904
|
+
return ctrl.$isEmpty(viewValue) || isUndefined(regexp) || regexp.test(viewValue);
|
37605
37905
|
};
|
37606
37906
|
}
|
37607
37907
|
};
|
@@ -38079,7 +38379,7 @@ _jQuery.fn.bindings = function(windowJquery, bindExp) {
|
|
38079
38379
|
}
|
38080
38380
|
|
38081
38381
|
function push(value) {
|
38082
|
-
if (value
|
38382
|
+
if (angular.isUndefined(value)) {
|
38083
38383
|
value = '';
|
38084
38384
|
} else if (typeof value !== 'string') {
|
38085
38385
|
value = angular.toJson(value);
|