angularjs-rails 1.3.14 → 1.3.15
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 +1 -1
- data/vendor/assets/javascripts/angular-aria.js +19 -4
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-messages.js +4 -3
- data/vendor/assets/javascripts/angular-mocks.js +73 -1
- data/vendor/assets/javascripts/angular-resource.js +1 -1
- data/vendor/assets/javascripts/angular-route.js +1 -1
- data/vendor/assets/javascripts/angular-sanitize.js +12 -1
- data/vendor/assets/javascripts/angular-scenario.js +177 -49
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +177 -49
- data/vendor/assets/javascripts/unstable/angular-animate.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-aria.js +19 -4
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +4 -3
- data/vendor/assets/javascripts/unstable/angular-mocks.js +73 -1
- data/vendor/assets/javascripts/unstable/angular-resource.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-route.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +12 -1
- data/vendor/assets/javascripts/unstable/angular-scenario.js +177 -49
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +177 -49
- metadata +2 -2
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.
|
2
|
+
* @license AngularJS v1.3.15
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -54,7 +54,7 @@ function minErr(module, ErrorConstructor) {
|
|
54
54
|
return match;
|
55
55
|
});
|
56
56
|
|
57
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.
|
57
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.15/' +
|
58
58
|
(module ? module + '/' : '') + code;
|
59
59
|
for (i = 2; i < arguments.length; i++) {
|
60
60
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i - 2) + '=' +
|
@@ -546,6 +546,12 @@ function isString(value) {return typeof value === 'string';}
|
|
546
546
|
* @description
|
547
547
|
* Determines if a reference is a `Number`.
|
548
548
|
*
|
549
|
+
* This includes the "special" numbers `NaN`, `+Infinity` and `-Infinity`.
|
550
|
+
*
|
551
|
+
* If you wish to exclude these then you can use the native
|
552
|
+
* [`isFinite'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/isFinite)
|
553
|
+
* method.
|
554
|
+
*
|
549
555
|
* @param {*} value Reference to check.
|
550
556
|
* @returns {boolean} True if `value` is a `Number`.
|
551
557
|
*/
|
@@ -914,10 +920,11 @@ function equals(o1, o2) {
|
|
914
920
|
} else if (isDate(o1)) {
|
915
921
|
if (!isDate(o2)) return false;
|
916
922
|
return equals(o1.getTime(), o2.getTime());
|
917
|
-
} else if (isRegExp(o1)
|
918
|
-
return o1.toString() == o2.toString();
|
923
|
+
} else if (isRegExp(o1)) {
|
924
|
+
return isRegExp(o2) ? o1.toString() == o2.toString() : false;
|
919
925
|
} else {
|
920
|
-
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||
|
926
|
+
if (isScope(o1) || isScope(o2) || isWindow(o1) || isWindow(o2) ||
|
927
|
+
isArray(o2) || isDate(o2) || isRegExp(o2)) return false;
|
921
928
|
keySet = {};
|
922
929
|
for (key in o1) {
|
923
930
|
if (key.charAt(0) === '$' || isFunction(o1[key])) continue;
|
@@ -2121,11 +2128,11 @@ function toDebugString(obj) {
|
|
2121
2128
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
2122
2129
|
*/
|
2123
2130
|
var version = {
|
2124
|
-
full: '1.3.
|
2131
|
+
full: '1.3.15', // all of these placeholder strings will be replaced by grunt's
|
2125
2132
|
major: 1, // package task
|
2126
2133
|
minor: 3,
|
2127
|
-
dot:
|
2128
|
-
codeName: '
|
2134
|
+
dot: 15,
|
2135
|
+
codeName: 'locality-filtration'
|
2129
2136
|
};
|
2130
2137
|
|
2131
2138
|
|
@@ -2262,6 +2269,17 @@ function publishExternalAPI(angular) {
|
|
2262
2269
|
]);
|
2263
2270
|
}
|
2264
2271
|
|
2272
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
2273
|
+
* Any commits to this file should be reviewed with security in mind. *
|
2274
|
+
* Changes to this file can potentially create security vulnerabilities. *
|
2275
|
+
* An approval from 2 Core members with history of modifying *
|
2276
|
+
* this file is required. *
|
2277
|
+
* *
|
2278
|
+
* Does the change somehow allow for arbitrary javascript to be executed? *
|
2279
|
+
* Or allows for someone to change the prototype of built-in objects? *
|
2280
|
+
* Or gives undesired access to variables likes document or window? *
|
2281
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
2282
|
+
|
2265
2283
|
/* global JQLitePrototype: true,
|
2266
2284
|
addEventListenerFn: true,
|
2267
2285
|
removeEventListenerFn: true,
|
@@ -4685,6 +4703,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
4685
4703
|
* @return {Promise} the animation callback promise
|
4686
4704
|
*/
|
4687
4705
|
leave: function(element, options) {
|
4706
|
+
applyStyles(element, options);
|
4688
4707
|
element.remove();
|
4689
4708
|
return asyncPromise();
|
4690
4709
|
},
|
@@ -5089,11 +5108,19 @@ function Browser(window, document, $log, $sniffer) {
|
|
5089
5108
|
fireUrlChange();
|
5090
5109
|
}
|
5091
5110
|
|
5111
|
+
function getCurrentState() {
|
5112
|
+
try {
|
5113
|
+
return history.state;
|
5114
|
+
} catch (e) {
|
5115
|
+
// MSIE can reportedly throw when there is no state (UNCONFIRMED).
|
5116
|
+
}
|
5117
|
+
}
|
5118
|
+
|
5092
5119
|
// This variable should be used *only* inside the cacheState function.
|
5093
5120
|
var lastCachedState = null;
|
5094
5121
|
function cacheState() {
|
5095
5122
|
// This should be the only place in $browser where `history.state` is read.
|
5096
|
-
cachedState =
|
5123
|
+
cachedState = getCurrentState();
|
5097
5124
|
cachedState = isUndefined(cachedState) ? null : cachedState;
|
5098
5125
|
|
5099
5126
|
// Prevent callbacks fo fire twice if both hashchange & popstate were fired.
|
@@ -5690,7 +5717,7 @@ function $CacheFactoryProvider() {
|
|
5690
5717
|
* the document, but it must be a descendent of the {@link ng.$rootElement $rootElement} (IE,
|
5691
5718
|
* element with ng-app attribute), otherwise the template will be ignored.
|
5692
5719
|
*
|
5693
|
-
* Adding via the
|
5720
|
+
* Adding via the `$templateCache` service:
|
5694
5721
|
*
|
5695
5722
|
* ```js
|
5696
5723
|
* var myApp = angular.module('myApp', []);
|
@@ -5718,6 +5745,17 @@ function $TemplateCacheProvider() {
|
|
5718
5745
|
}];
|
5719
5746
|
}
|
5720
5747
|
|
5748
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
5749
|
+
* Any commits to this file should be reviewed with security in mind. *
|
5750
|
+
* Changes to this file can potentially create security vulnerabilities. *
|
5751
|
+
* An approval from 2 Core members with history of modifying *
|
5752
|
+
* this file is required. *
|
5753
|
+
* *
|
5754
|
+
* Does the change somehow allow for arbitrary javascript to be executed? *
|
5755
|
+
* Or allows for someone to change the prototype of built-in objects? *
|
5756
|
+
* Or gives undesired access to variables likes document or window? *
|
5757
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
5758
|
+
|
5721
5759
|
/* ! VARIABLE/FUNCTION NAMING CONVENTIONS THAT APPLY TO THIS FILE!
|
5722
5760
|
*
|
5723
5761
|
* DOM-related variables:
|
@@ -5929,7 +5967,8 @@ function $TemplateCacheProvider() {
|
|
5929
5967
|
* Require another directive and inject its controller as the fourth argument to the linking function. The
|
5930
5968
|
* `require` takes a string name (or array of strings) of the directive(s) to pass in. If an array is used, the
|
5931
5969
|
* injected argument will be an array in corresponding order. If no such directive can be
|
5932
|
-
* found, or if the directive does not have a controller, then an error is raised
|
5970
|
+
* found, or if the directive does not have a controller, then an error is raised (unless no link function
|
5971
|
+
* is specified, in which case error checking is skipped). The name can be prefixed with:
|
5933
5972
|
*
|
5934
5973
|
* * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
|
5935
5974
|
* * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
|
@@ -10479,7 +10518,15 @@ function $LocaleProvider() {
|
|
10479
10518
|
mediumDate: 'MMM d, y',
|
10480
10519
|
shortDate: 'M/d/yy',
|
10481
10520
|
mediumTime: 'h:mm:ss a',
|
10482
|
-
shortTime: 'h:mm a'
|
10521
|
+
shortTime: 'h:mm a',
|
10522
|
+
ERANAMES: [
|
10523
|
+
"Before Christ",
|
10524
|
+
"Anno Domini"
|
10525
|
+
],
|
10526
|
+
ERAS: [
|
10527
|
+
"BC",
|
10528
|
+
"AD"
|
10529
|
+
]
|
10483
10530
|
},
|
10484
10531
|
|
10485
10532
|
pluralCat: function(num) {
|
@@ -11487,6 +11534,7 @@ function $LocationProvider() {
|
|
11487
11534
|
<button ng-click="$log.warn(message)">warn</button>
|
11488
11535
|
<button ng-click="$log.info(message)">info</button>
|
11489
11536
|
<button ng-click="$log.error(message)">error</button>
|
11537
|
+
<button ng-click="$log.debug(message)">debug</button>
|
11490
11538
|
</div>
|
11491
11539
|
</file>
|
11492
11540
|
</example>
|
@@ -11617,6 +11665,17 @@ function $LogProvider() {
|
|
11617
11665
|
}];
|
11618
11666
|
}
|
11619
11667
|
|
11668
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
11669
|
+
* Any commits to this file should be reviewed with security in mind. *
|
11670
|
+
* Changes to this file can potentially create security vulnerabilities. *
|
11671
|
+
* An approval from 2 Core members with history of modifying *
|
11672
|
+
* this file is required. *
|
11673
|
+
* *
|
11674
|
+
* Does the change somehow allow for arbitrary javascript to be executed? *
|
11675
|
+
* Or allows for someone to change the prototype of built-in objects? *
|
11676
|
+
* Or gives undesired access to variables likes document or window? *
|
11677
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
11678
|
+
|
11620
11679
|
var $parseMinErr = minErr('$parse');
|
11621
11680
|
|
11622
11681
|
// Sandboxing Angular Expressions
|
@@ -13552,9 +13611,27 @@ function $RootScopeProvider() {
|
|
13552
13611
|
return TTL;
|
13553
13612
|
};
|
13554
13613
|
|
13614
|
+
function createChildScopeClass(parent) {
|
13615
|
+
function ChildScope() {
|
13616
|
+
this.$$watchers = this.$$nextSibling =
|
13617
|
+
this.$$childHead = this.$$childTail = null;
|
13618
|
+
this.$$listeners = {};
|
13619
|
+
this.$$listenerCount = {};
|
13620
|
+
this.$$watchersCount = 0;
|
13621
|
+
this.$id = nextUid();
|
13622
|
+
this.$$ChildScope = null;
|
13623
|
+
}
|
13624
|
+
ChildScope.prototype = parent;
|
13625
|
+
return ChildScope;
|
13626
|
+
}
|
13627
|
+
|
13555
13628
|
this.$get = ['$injector', '$exceptionHandler', '$parse', '$browser',
|
13556
13629
|
function($injector, $exceptionHandler, $parse, $browser) {
|
13557
13630
|
|
13631
|
+
function destroyChildScope($event) {
|
13632
|
+
$event.currentScope.$$destroyed = true;
|
13633
|
+
}
|
13634
|
+
|
13558
13635
|
/**
|
13559
13636
|
* @ngdoc type
|
13560
13637
|
* @name $rootScope.Scope
|
@@ -13677,15 +13754,7 @@ function $RootScopeProvider() {
|
|
13677
13754
|
// Only create a child scope class if somebody asks for one,
|
13678
13755
|
// but cache it to allow the VM to optimize lookups.
|
13679
13756
|
if (!this.$$ChildScope) {
|
13680
|
-
this.$$ChildScope =
|
13681
|
-
this.$$watchers = this.$$nextSibling =
|
13682
|
-
this.$$childHead = this.$$childTail = null;
|
13683
|
-
this.$$listeners = {};
|
13684
|
-
this.$$listenerCount = {};
|
13685
|
-
this.$id = nextUid();
|
13686
|
-
this.$$ChildScope = null;
|
13687
|
-
};
|
13688
|
-
this.$$ChildScope.prototype = this;
|
13757
|
+
this.$$ChildScope = createChildScopeClass(this);
|
13689
13758
|
}
|
13690
13759
|
child = new this.$$ChildScope();
|
13691
13760
|
}
|
@@ -13703,13 +13772,9 @@ function $RootScopeProvider() {
|
|
13703
13772
|
// prototypically. In all other cases, this property needs to be set
|
13704
13773
|
// when the parent scope is destroyed.
|
13705
13774
|
// The listener needs to be added after the parent is set
|
13706
|
-
if (isolate || parent != this) child.$on('$destroy',
|
13775
|
+
if (isolate || parent != this) child.$on('$destroy', destroyChildScope);
|
13707
13776
|
|
13708
13777
|
return child;
|
13709
|
-
|
13710
|
-
function destroyChild() {
|
13711
|
-
child.$$destroyed = true;
|
13712
|
-
}
|
13713
13778
|
},
|
13714
13779
|
|
13715
13780
|
/**
|
@@ -14870,6 +14935,17 @@ function $$SanitizeUriProvider() {
|
|
14870
14935
|
};
|
14871
14936
|
}
|
14872
14937
|
|
14938
|
+
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
14939
|
+
* Any commits to this file should be reviewed with security in mind. *
|
14940
|
+
* Changes to this file can potentially create security vulnerabilities. *
|
14941
|
+
* An approval from 2 Core members with history of modifying *
|
14942
|
+
* this file is required. *
|
14943
|
+
* *
|
14944
|
+
* Does the change somehow allow for arbitrary javascript to be executed? *
|
14945
|
+
* Or allows for someone to change the prototype of built-in objects? *
|
14946
|
+
* Or gives undesired access to variables likes document or window? *
|
14947
|
+
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
14948
|
+
|
14873
14949
|
var $sceMinErr = minErr('$sce');
|
14874
14950
|
|
14875
14951
|
var SCE_CONTEXTS = {
|
@@ -16045,7 +16121,7 @@ function $TemplateRequestProvider() {
|
|
16045
16121
|
};
|
16046
16122
|
|
16047
16123
|
return $http.get(tpl, httpOptions)
|
16048
|
-
|
16124
|
+
['finally'](function() {
|
16049
16125
|
handleRequestFn.totalPendingRequests--;
|
16050
16126
|
})
|
16051
16127
|
.then(function(response) {
|
@@ -16741,8 +16817,8 @@ function createPredicateFn(expression, comparator, matchAgainstAnyProp) {
|
|
16741
16817
|
}
|
16742
16818
|
|
16743
16819
|
function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatchWholeObject) {
|
16744
|
-
var actualType = typeof actual;
|
16745
|
-
var expectedType = typeof expected;
|
16820
|
+
var actualType = (actual !== null) ? typeof actual : 'null';
|
16821
|
+
var expectedType = (expected !== null) ? typeof expected : 'null';
|
16746
16822
|
|
16747
16823
|
if ((expectedType === 'string') && (expected.charAt(0) === '!')) {
|
16748
16824
|
return !deepCompare(actual, expected.substring(1), comparator, matchAgainstAnyProp);
|
@@ -16767,7 +16843,7 @@ function deepCompare(actual, expected, comparator, matchAgainstAnyProp, dontMatc
|
|
16767
16843
|
} else if (expectedType === 'object') {
|
16768
16844
|
for (key in expected) {
|
16769
16845
|
var expectedVal = expected[key];
|
16770
|
-
if (isFunction(expectedVal)) {
|
16846
|
+
if (isFunction(expectedVal) || isUndefined(expectedVal)) {
|
16771
16847
|
continue;
|
16772
16848
|
}
|
16773
16849
|
|
@@ -17081,6 +17157,14 @@ function ampmGetter(date, formats) {
|
|
17081
17157
|
return date.getHours() < 12 ? formats.AMPMS[0] : formats.AMPMS[1];
|
17082
17158
|
}
|
17083
17159
|
|
17160
|
+
function eraGetter(date, formats) {
|
17161
|
+
return date.getFullYear() <= 0 ? formats.ERAS[0] : formats.ERAS[1];
|
17162
|
+
}
|
17163
|
+
|
17164
|
+
function longEraGetter(date, formats) {
|
17165
|
+
return date.getFullYear() <= 0 ? formats.ERANAMES[0] : formats.ERANAMES[1];
|
17166
|
+
}
|
17167
|
+
|
17084
17168
|
var DATE_FORMATS = {
|
17085
17169
|
yyyy: dateGetter('FullYear', 4),
|
17086
17170
|
yy: dateGetter('FullYear', 2, 0, true),
|
@@ -17107,10 +17191,14 @@ var DATE_FORMATS = {
|
|
17107
17191
|
a: ampmGetter,
|
17108
17192
|
Z: timeZoneGetter,
|
17109
17193
|
ww: weekGetter(2),
|
17110
|
-
w: weekGetter(1)
|
17194
|
+
w: weekGetter(1),
|
17195
|
+
G: eraGetter,
|
17196
|
+
GG: eraGetter,
|
17197
|
+
GGG: eraGetter,
|
17198
|
+
GGGG: longEraGetter
|
17111
17199
|
};
|
17112
17200
|
|
17113
|
-
var DATE_FORMATS_SPLIT = /((?:[^
|
17201
|
+
var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+|H+|h+|m+|s+|a|Z|G+|w+))(.*)/,
|
17114
17202
|
NUMBER_STRING = /^\-?\d+$/;
|
17115
17203
|
|
17116
17204
|
/**
|
@@ -17147,6 +17235,8 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZEw']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d
|
|
17147
17235
|
* * `'Z'`: 4 digit (+sign) representation of the timezone offset (-1200-+1200)
|
17148
17236
|
* * `'ww'`: Week of year, padded (00-53). Week 01 is the week with the first Thursday of the year
|
17149
17237
|
* * `'w'`: Week of year (0-53). Week 1 is the week with the first Thursday of the year
|
17238
|
+
* * `'G'`, `'GG'`, `'GGG'`: The abbreviated form of the era string (e.g. 'AD')
|
17239
|
+
* * `'GGGG'`: The long form of the era string (e.g. 'Anno Domini')
|
17150
17240
|
*
|
17151
17241
|
* `format` string can also be one of the following predefined
|
17152
17242
|
* {@link guide/i18n localizable formats}:
|
@@ -17480,6 +17570,43 @@ function limitToFilter() {
|
|
17480
17570
|
* @param {boolean=} reverse Reverse the order of the array.
|
17481
17571
|
* @returns {Array} Sorted copy of the source array.
|
17482
17572
|
*
|
17573
|
+
*
|
17574
|
+
* @example
|
17575
|
+
* The example below demonstrates a simple ngRepeat, where the data is sorted
|
17576
|
+
* by age in descending order (predicate is set to `'-age'`).
|
17577
|
+
* `reverse` is not set, which means it defaults to `false`.
|
17578
|
+
<example module="orderByExample">
|
17579
|
+
<file name="index.html">
|
17580
|
+
<script>
|
17581
|
+
angular.module('orderByExample', [])
|
17582
|
+
.controller('ExampleController', ['$scope', function($scope) {
|
17583
|
+
$scope.friends =
|
17584
|
+
[{name:'John', phone:'555-1212', age:10},
|
17585
|
+
{name:'Mary', phone:'555-9876', age:19},
|
17586
|
+
{name:'Mike', phone:'555-4321', age:21},
|
17587
|
+
{name:'Adam', phone:'555-5678', age:35},
|
17588
|
+
{name:'Julie', phone:'555-8765', age:29}];
|
17589
|
+
}]);
|
17590
|
+
</script>
|
17591
|
+
<div ng-controller="ExampleController">
|
17592
|
+
<table class="friend">
|
17593
|
+
<tr>
|
17594
|
+
<th>Name</th>
|
17595
|
+
<th>Phone Number</th>
|
17596
|
+
<th>Age</th>
|
17597
|
+
</tr>
|
17598
|
+
<tr ng-repeat="friend in friends | orderBy:'-age'">
|
17599
|
+
<td>{{friend.name}}</td>
|
17600
|
+
<td>{{friend.phone}}</td>
|
17601
|
+
<td>{{friend.age}}</td>
|
17602
|
+
</tr>
|
17603
|
+
</table>
|
17604
|
+
</div>
|
17605
|
+
</file>
|
17606
|
+
</example>
|
17607
|
+
*
|
17608
|
+
* The predicate and reverse parameters can be controlled dynamically through scope properties,
|
17609
|
+
* as shown in the next example.
|
17483
17610
|
* @example
|
17484
17611
|
<example module="orderByExample">
|
17485
17612
|
<file name="index.html">
|
@@ -17862,6 +17989,7 @@ var htmlAnchorDirective = valueFn({
|
|
17862
17989
|
* but not on older IEs:
|
17863
17990
|
*
|
17864
17991
|
* ```html
|
17992
|
+
* <!-- See below for an example of ng-disabled being used correctly -->
|
17865
17993
|
* <div ng-init="isDisabled = false">
|
17866
17994
|
* <button disabled="{{isDisabled}}">Disabled</button>
|
17867
17995
|
* </div>
|
@@ -18437,7 +18565,7 @@ function FormController(element, attrs, $scope, $animate, $interpolate) {
|
|
18437
18565
|
*
|
18438
18566
|
* # Alias: {@link ng.directive:ngForm `ngForm`}
|
18439
18567
|
*
|
18440
|
-
* In Angular forms can be nested. This means that the outer form is valid when all of the child
|
18568
|
+
* In Angular, forms can be nested. This means that the outer form is valid when all of the child
|
18441
18569
|
* forms are valid as well. However, browsers do not allow nesting of `<form>` elements, so
|
18442
18570
|
* Angular provides the {@link ng.directive:ngForm `ngForm`} directive which behaves identically to
|
18443
18571
|
* `<form>` but can be nested. This allows you to have nested forms, which is very useful when
|
@@ -18575,10 +18703,12 @@ var formDirectiveFactory = function(isNgForm) {
|
|
18575
18703
|
name: 'form',
|
18576
18704
|
restrict: isNgForm ? 'EAC' : 'E',
|
18577
18705
|
controller: FormController,
|
18578
|
-
compile: function ngFormCompile(formElement) {
|
18706
|
+
compile: function ngFormCompile(formElement, attr) {
|
18579
18707
|
// Setup initial state of the control
|
18580
18708
|
formElement.addClass(PRISTINE_CLASS).addClass(VALID_CLASS);
|
18581
18709
|
|
18710
|
+
var nameAttr = attr.name ? 'name' : (isNgForm && attr.ngForm ? 'ngForm' : false);
|
18711
|
+
|
18582
18712
|
return {
|
18583
18713
|
pre: function ngFormPreLink(scope, formElement, attr, controller) {
|
18584
18714
|
// if `action` attr is not present on the form, prevent the default action (submission)
|
@@ -18609,23 +18739,21 @@ var formDirectiveFactory = function(isNgForm) {
|
|
18609
18739
|
});
|
18610
18740
|
}
|
18611
18741
|
|
18612
|
-
var parentFormCtrl = controller.$$parentForm
|
18613
|
-
|
18614
|
-
|
18615
|
-
|
18616
|
-
|
18617
|
-
|
18618
|
-
|
18619
|
-
|
18620
|
-
|
18621
|
-
setter(scope, null, alias, controller, alias);
|
18622
|
-
parentFormCtrl.$$renameControl(controller, alias);
|
18742
|
+
var parentFormCtrl = controller.$$parentForm;
|
18743
|
+
|
18744
|
+
if (nameAttr) {
|
18745
|
+
setter(scope, null, controller.$name, controller, controller.$name);
|
18746
|
+
attr.$observe(nameAttr, function(newValue) {
|
18747
|
+
if (controller.$name === newValue) return;
|
18748
|
+
setter(scope, null, controller.$name, undefined, controller.$name);
|
18749
|
+
parentFormCtrl.$$renameControl(controller, newValue);
|
18750
|
+
setter(scope, null, controller.$name, controller, controller.$name);
|
18623
18751
|
});
|
18624
18752
|
}
|
18625
18753
|
formElement.on('$destroy', function() {
|
18626
18754
|
parentFormCtrl.$removeControl(controller);
|
18627
|
-
if (
|
18628
|
-
setter(scope, null,
|
18755
|
+
if (nameAttr) {
|
18756
|
+
setter(scope, null, attr[nameAttr], undefined, controller.$name);
|
18629
18757
|
}
|
18630
18758
|
extend(controller, nullFormCtrl); //stop propagating child destruction handlers upwards
|
18631
18759
|
});
|
@@ -22598,8 +22726,8 @@ is set to `true`. The parse error is stored in `ngModel.$error.parse`.
|
|
22598
22726
|
* data-binding. Notice how different directives (`contenteditable`, `ng-model`, and `required`)
|
22599
22727
|
* collaborate together to achieve the desired result.
|
22600
22728
|
*
|
22601
|
-
*
|
22602
|
-
* contents be edited in place by the user.
|
22729
|
+
* `contenteditable` is an HTML5 attribute, which tells the browser to let the element
|
22730
|
+
* contents be edited in place by the user.
|
22603
22731
|
*
|
22604
22732
|
* We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}
|
22605
22733
|
* module to automatically remove "bad" content like inline event listener (e.g. `<span onclick="...">`).
|