angularjs-rails 1.2.20 → 1.2.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/angularjs-rails/version.rb +2 -2
- data/vendor/assets/javascripts/angular-animate.js +3 -3
- data/vendor/assets/javascripts/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/angular-loader.js +2 -2
- data/vendor/assets/javascripts/angular-mocks.js +3 -1
- data/vendor/assets/javascripts/angular-resource.js +12 -12
- data/vendor/assets/javascripts/angular-route.js +2 -4
- data/vendor/assets/javascripts/angular-sanitize.js +16 -8
- data/vendor/assets/javascripts/angular-scenario.js +275 -214
- data/vendor/assets/javascripts/angular-touch.js +1 -1
- data/vendor/assets/javascripts/angular.js +275 -214
- data/vendor/assets/javascripts/unstable/angular-animate.js +3 -3
- data/vendor/assets/javascripts/unstable/angular-cookies.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-loader.js +2 -2
- data/vendor/assets/javascripts/unstable/angular-messages.js +1 -1
- data/vendor/assets/javascripts/unstable/angular-mocks.js +3 -1
- data/vendor/assets/javascripts/unstable/angular-resource.js +12 -12
- data/vendor/assets/javascripts/unstable/angular-route.js +2 -4
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +16 -8
- data/vendor/assets/javascripts/unstable/angular-scenario.js +617 -407
- data/vendor/assets/javascripts/unstable/angular-touch.js +1 -1
- data/vendor/assets/javascripts/unstable/angular.js +615 -405
- metadata +14 -14
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -50,9 +50,9 @@
|
|
50
50
|
* }
|
51
51
|
*
|
52
52
|
* .slide.ng-enter { } /* starting animations for enter */
|
53
|
-
* .slide.ng-enter-active { } /* terminal animations for enter */
|
53
|
+
* .slide.ng-enter.ng-enter-active { } /* terminal animations for enter */
|
54
54
|
* .slide.ng-leave { } /* starting animations for leave */
|
55
|
-
* .slide.ng-leave-active { } /* terminal animations for leave */
|
55
|
+
* .slide.ng-leave.ng-leave-active { } /* terminal animations for leave */
|
56
56
|
* </style>
|
57
57
|
*
|
58
58
|
* <!--
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -69,7 +69,7 @@ function minErr(module) {
|
|
69
69
|
return match;
|
70
70
|
});
|
71
71
|
|
72
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.0-beta.
|
72
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.0-beta.17/' +
|
73
73
|
(module ? module + '/' : '') + code;
|
74
74
|
for (i = 2; i < arguments.length; i++) {
|
75
75
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -1739,6 +1739,7 @@ angular.mock.$RootElementProvider = function() {
|
|
1739
1739
|
/**
|
1740
1740
|
* @ngdoc module
|
1741
1741
|
* @name ngMock
|
1742
|
+
* @packageName angular-mocks
|
1742
1743
|
* @description
|
1743
1744
|
*
|
1744
1745
|
* # ngMock
|
@@ -1768,6 +1769,7 @@ angular.module('ngMock', ['ng']).provider({
|
|
1768
1769
|
* @ngdoc module
|
1769
1770
|
* @name ngMockE2E
|
1770
1771
|
* @module ngMockE2E
|
1772
|
+
* @packageName angular-mocks
|
1771
1773
|
* @description
|
1772
1774
|
*
|
1773
1775
|
* The `ngMockE2E` is an angular module which contains mocks suitable for end-to-end testing.
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -126,8 +126,8 @@ function shallowClearAndCopy(src, dst) {
|
|
126
126
|
*
|
127
127
|
* - **`action`** – {string} – The name of action. This name becomes the name of the method on
|
128
128
|
* your resource object.
|
129
|
-
* - **`method`** – {string} – HTTP
|
130
|
-
* `DELETE`,
|
129
|
+
* - **`method`** – {string} – Case insensitive HTTP method (e.g. `GET`, `POST`, `PUT`,
|
130
|
+
* `DELETE`, `JSONP`, etc).
|
131
131
|
* - **`params`** – {Object=} – Optional set of pre-bound parameters for this action. If any of
|
132
132
|
* the parameter value is a function, it will be executed every time when a param value needs to
|
133
133
|
* be obtained for a request (unless the param was overridden).
|
@@ -315,20 +315,20 @@ function shallowClearAndCopy(src, dst) {
|
|
315
315
|
* # Creating a custom 'PUT' request
|
316
316
|
* In this example we create a custom method on our resource to make a PUT request
|
317
317
|
* ```js
|
318
|
-
*
|
318
|
+
* var app = angular.module('app', ['ngResource', 'ngRoute']);
|
319
319
|
*
|
320
|
-
*
|
321
|
-
*
|
322
|
-
*
|
320
|
+
* // Some APIs expect a PUT request in the format URL/object/ID
|
321
|
+
* // Here we are creating an 'update' method
|
322
|
+
* app.factory('Notes', ['$resource', function($resource) {
|
323
323
|
* return $resource('/notes/:id', null,
|
324
324
|
* {
|
325
325
|
* 'update': { method:'PUT' }
|
326
326
|
* });
|
327
|
-
*
|
327
|
+
* }]);
|
328
328
|
*
|
329
|
-
*
|
330
|
-
*
|
331
|
-
*
|
329
|
+
* // In our controller we get the ID from the URL using ngRoute and $routeParams
|
330
|
+
* // We pass in $routeParams and our Notes factory along with $scope
|
331
|
+
* app.controller('NotesCtrl', ['$scope', '$routeParams', 'Notes',
|
332
332
|
function($scope, $routeParams, Notes) {
|
333
333
|
* // First get a note object from the factory
|
334
334
|
* var note = Notes.get({ id:$routeParams.id });
|
@@ -338,7 +338,7 @@ function shallowClearAndCopy(src, dst) {
|
|
338
338
|
* Notes.update({ id:$id }, note);
|
339
339
|
*
|
340
340
|
* // This will PUT /notes/ID with the note object in the request payload
|
341
|
-
*
|
341
|
+
* }]);
|
342
342
|
* ```
|
343
343
|
*/
|
344
344
|
angular.module('ngResource', ['ng']).
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -473,9 +473,7 @@ function $RouteProvider(){
|
|
473
473
|
for (var i = 1, len = m.length; i < len; ++i) {
|
474
474
|
var key = keys[i - 1];
|
475
475
|
|
476
|
-
var val =
|
477
|
-
? decodeURIComponent(m[i])
|
478
|
-
: m[i];
|
476
|
+
var val = m[i];
|
479
477
|
|
480
478
|
if (key && val) {
|
481
479
|
params[key.name] = val;
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.3.0-beta.
|
2
|
+
* @license AngularJS v1.3.0-beta.17
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -159,11 +159,11 @@ function sanitizeText(chars) {
|
|
159
159
|
|
160
160
|
// Regular Expressions for parsing tags and attributes
|
161
161
|
var START_TAG_REGEXP =
|
162
|
-
|
163
|
-
END_TAG_REGEXP =
|
162
|
+
/^<((?:[a-zA-Z])[\w:-]*)((?:\s+[\w:-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)\s*(>?)/,
|
163
|
+
END_TAG_REGEXP = /^<\/\s*([\w:-]+)[^>]*>/,
|
164
164
|
ATTR_REGEXP = /([\w:-]+)(?:\s*=\s*(?:(?:"((?:[^"])*)")|(?:'((?:[^'])*)')|([^>\s]+)))?/g,
|
165
165
|
BEGIN_TAG_REGEXP = /^</,
|
166
|
-
BEGING_END_TAGE_REGEXP =
|
166
|
+
BEGING_END_TAGE_REGEXP = /^<\//,
|
167
167
|
COMMENT_REGEXP = /<!--(.*?)-->/g,
|
168
168
|
DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
|
169
169
|
CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
|
@@ -237,10 +237,11 @@ function makeMap(str) {
|
|
237
237
|
* @param {object} handler
|
238
238
|
*/
|
239
239
|
function htmlParser( html, handler ) {
|
240
|
-
var index, chars, match, stack = [], last = html;
|
240
|
+
var index, chars, match, stack = [], last = html, text;
|
241
241
|
stack.last = function() { return stack[ stack.length - 1 ]; };
|
242
242
|
|
243
243
|
while ( html ) {
|
244
|
+
text = '';
|
244
245
|
chars = true;
|
245
246
|
|
246
247
|
// Make sure we're not in a script or style element
|
@@ -279,16 +280,23 @@ function htmlParser( html, handler ) {
|
|
279
280
|
match = html.match( START_TAG_REGEXP );
|
280
281
|
|
281
282
|
if ( match ) {
|
282
|
-
|
283
|
-
match[
|
283
|
+
// We only have a valid start-tag if there is a '>'.
|
284
|
+
if ( match[4] ) {
|
285
|
+
html = html.substring( match[0].length );
|
286
|
+
match[0].replace( START_TAG_REGEXP, parseStartTag );
|
287
|
+
}
|
284
288
|
chars = false;
|
289
|
+
} else {
|
290
|
+
// no ending tag found --- this piece should be encoded as an entity.
|
291
|
+
text += '<';
|
292
|
+
html = html.substring(1);
|
285
293
|
}
|
286
294
|
}
|
287
295
|
|
288
296
|
if ( chars ) {
|
289
297
|
index = html.indexOf("<");
|
290
298
|
|
291
|
-
|
299
|
+
text += index < 0 ? html : html.substring( 0, index );
|
292
300
|
html = index < 0 ? "" : html.substring( index );
|
293
301
|
|
294
302
|
if (handler.chars) handler.chars( decodeEntities(text) );
|
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
|
|
9790
9790
|
})( window );
|
9791
9791
|
|
9792
9792
|
/**
|
9793
|
-
* @license AngularJS v1.3.0-beta.
|
9793
|
+
* @license AngularJS v1.3.0-beta.17
|
9794
9794
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
9795
9795
|
* License: MIT
|
9796
9796
|
*/
|
@@ -9860,7 +9860,7 @@ function minErr(module) {
|
|
9860
9860
|
return match;
|
9861
9861
|
});
|
9862
9862
|
|
9863
|
-
message = message + '\nhttp://errors.angularjs.org/1.3.0-beta.
|
9863
|
+
message = message + '\nhttp://errors.angularjs.org/1.3.0-beta.17/' +
|
9864
9864
|
(module ? module + '/' : '') + code;
|
9865
9865
|
for (i = 2; i < arguments.length; i++) {
|
9866
9866
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -9918,6 +9918,7 @@ function minErr(module) {
|
|
9918
9918
|
isFile: true,
|
9919
9919
|
isBlob: true,
|
9920
9920
|
isBoolean: true,
|
9921
|
+
isPromiseLike: true,
|
9921
9922
|
trim: true,
|
9922
9923
|
isElement: true,
|
9923
9924
|
makeMap: true,
|
@@ -10440,6 +10441,11 @@ function isBoolean(value) {
|
|
10440
10441
|
}
|
10441
10442
|
|
10442
10443
|
|
10444
|
+
function isPromiseLike(obj) {
|
10445
|
+
return obj && isFunction(obj.then);
|
10446
|
+
}
|
10447
|
+
|
10448
|
+
|
10443
10449
|
var trim = (function() {
|
10444
10450
|
// native trim is way faster: http://jsperf.com/angular-trim-test
|
10445
10451
|
// but IE doesn't have it... :-(
|
@@ -10606,7 +10612,7 @@ function isLeafNode (node) {
|
|
10606
10612
|
</div>
|
10607
10613
|
|
10608
10614
|
<script>
|
10609
|
-
angular.module('copyExample')
|
10615
|
+
angular.module('copyExample', [])
|
10610
10616
|
.controller('ExampleController', ['$scope', function($scope) {
|
10611
10617
|
$scope.master= {};
|
10612
10618
|
|
@@ -10640,7 +10646,8 @@ function copy(source, destination, stackSource, stackDest) {
|
|
10640
10646
|
} else if (isDate(source)) {
|
10641
10647
|
destination = new Date(source.getTime());
|
10642
10648
|
} else if (isRegExp(source)) {
|
10643
|
-
destination = new RegExp(source.source);
|
10649
|
+
destination = new RegExp(source.source, source.toString().match(/[^\/]*$/)[0]);
|
10650
|
+
destination.lastIndex = source.lastIndex;
|
10644
10651
|
} else if (isObject(source)) {
|
10645
10652
|
var emptyObject = Object.create(Object.getPrototypeOf(source));
|
10646
10653
|
destination = copy(source, emptyObject, stackSource, stackDest);
|
@@ -10792,12 +10799,25 @@ function equals(o1, o2) {
|
|
10792
10799
|
return false;
|
10793
10800
|
}
|
10794
10801
|
|
10802
|
+
var csp = function() {
|
10803
|
+
if (isDefined(csp.isActive_)) return csp.isActive_;
|
10804
|
+
|
10805
|
+
var active = !!(document.querySelector('[ng-csp]') ||
|
10806
|
+
document.querySelector('[data-ng-csp]'));
|
10807
|
+
|
10808
|
+
if (!active) {
|
10809
|
+
try {
|
10810
|
+
/* jshint -W031, -W054 */
|
10811
|
+
new Function('');
|
10812
|
+
/* jshint +W031, +W054 */
|
10813
|
+
} catch (e) {
|
10814
|
+
active = true;
|
10815
|
+
}
|
10816
|
+
}
|
10817
|
+
|
10818
|
+
return (csp.isActive_ = active);
|
10819
|
+
};
|
10795
10820
|
|
10796
|
-
function csp() {
|
10797
|
-
return (document.securityPolicy && document.securityPolicy.isActive) ||
|
10798
|
-
(document.querySelector &&
|
10799
|
-
!!(document.querySelector('[ng-csp]') || document.querySelector('[data-ng-csp]')));
|
10800
|
-
}
|
10801
10821
|
|
10802
10822
|
|
10803
10823
|
function concat(array1, array2, index) {
|
@@ -10957,7 +10977,7 @@ function parseKeyValue(/**string*/keyValue) {
|
|
10957
10977
|
var obj = {}, key_value, key;
|
10958
10978
|
forEach((keyValue || "").split('&'), function(keyValue) {
|
10959
10979
|
if ( keyValue ) {
|
10960
|
-
key_value = keyValue.split('=');
|
10980
|
+
key_value = keyValue.replace(/\+/g,'%20').split('=');
|
10961
10981
|
key = tryDecodeURIComponent(key_value[0]);
|
10962
10982
|
if ( isDefined(key) ) {
|
10963
10983
|
var val = isDefined(key_value[1]) ? tryDecodeURIComponent(key_value[1]) : true;
|
@@ -11033,7 +11053,7 @@ function encodeUriQuery(val, pctEncodeSpaces) {
|
|
11033
11053
|
var ngAttrPrefixes = ['ng-', 'data-ng-', 'ng:', 'x-ng-'];
|
11034
11054
|
|
11035
11055
|
function getNgAttribute(element, ngAttr) {
|
11036
|
-
var attr, i, ii = ngAttrPrefixes.length
|
11056
|
+
var attr, i, ii = ngAttrPrefixes.length;
|
11037
11057
|
element = jqLite(element);
|
11038
11058
|
for (i=0; i<ii; ++i) {
|
11039
11059
|
attr = ngAttrPrefixes[i] + ngAttr;
|
@@ -11172,46 +11192,26 @@ function getNgAttribute(element, ngAttr) {
|
|
11172
11192
|
</example>
|
11173
11193
|
*/
|
11174
11194
|
function angularInit(element, bootstrap) {
|
11175
|
-
var
|
11176
|
-
appElement,
|
11195
|
+
var appElement,
|
11177
11196
|
module,
|
11178
|
-
config = {}
|
11179
|
-
names = ['ng:app', 'ng-app', 'x-ng-app', 'data-ng-app'],
|
11180
|
-
options = {
|
11181
|
-
'boolean': ['strict-di']
|
11182
|
-
},
|
11183
|
-
NG_APP_CLASS_REGEXP = /\sng[:\-]app(:\s*([\w\d_]+);?)?\s/;
|
11197
|
+
config = {};
|
11184
11198
|
|
11185
|
-
|
11186
|
-
|
11187
|
-
|
11199
|
+
// The element `element` has priority over any other element
|
11200
|
+
forEach(ngAttrPrefixes, function(prefix) {
|
11201
|
+
var name = prefix + 'app';
|
11188
11202
|
|
11189
|
-
|
11190
|
-
|
11191
|
-
|
11192
|
-
name = name.replace(':', '\\:');
|
11193
|
-
if (element.querySelectorAll) {
|
11194
|
-
forEach(element.querySelectorAll('.' + name), append);
|
11195
|
-
forEach(element.querySelectorAll('.' + name + '\\:'), append);
|
11196
|
-
forEach(element.querySelectorAll('[' + name + ']'), append);
|
11203
|
+
if (!appElement && element.hasAttribute && element.hasAttribute(name)) {
|
11204
|
+
appElement = element;
|
11205
|
+
module = element.getAttribute(name);
|
11197
11206
|
}
|
11198
11207
|
});
|
11208
|
+
forEach(ngAttrPrefixes, function(prefix) {
|
11209
|
+
var name = prefix + 'app';
|
11210
|
+
var candidate;
|
11199
11211
|
|
11200
|
-
|
11201
|
-
|
11202
|
-
|
11203
|
-
var match = NG_APP_CLASS_REGEXP.exec(className);
|
11204
|
-
if (match) {
|
11205
|
-
appElement = element;
|
11206
|
-
module = (match[2] || '').replace(/\s+/g, ',');
|
11207
|
-
} else {
|
11208
|
-
forEach(element.attributes, function(attr) {
|
11209
|
-
if (!appElement && names[attr.name]) {
|
11210
|
-
appElement = element;
|
11211
|
-
module = attr.value;
|
11212
|
-
}
|
11213
|
-
});
|
11214
|
-
}
|
11212
|
+
if (!appElement && (candidate = element.querySelector('[' + name.replace(':', '\\:') + ']'))) {
|
11213
|
+
appElement = candidate;
|
11214
|
+
module = candidate.getAttribute(name);
|
11215
11215
|
}
|
11216
11216
|
});
|
11217
11217
|
if (appElement) {
|
@@ -11859,11 +11859,11 @@ function setupModuleLoader(window) {
|
|
11859
11859
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11860
11860
|
*/
|
11861
11861
|
var version = {
|
11862
|
-
full: '1.3.0-beta.
|
11862
|
+
full: '1.3.0-beta.17', // all of these placeholder strings will be replaced by grunt's
|
11863
11863
|
major: 1, // package task
|
11864
11864
|
minor: 3,
|
11865
11865
|
dot: 0,
|
11866
|
-
codeName: '
|
11866
|
+
codeName: 'turing-autocompletion'
|
11867
11867
|
};
|
11868
11868
|
|
11869
11869
|
|
@@ -12406,25 +12406,22 @@ function jqLiteController(element, name) {
|
|
12406
12406
|
}
|
12407
12407
|
|
12408
12408
|
function jqLiteInheritedData(element, name, value) {
|
12409
|
-
element = jqLite(element);
|
12410
|
-
|
12411
12409
|
// if element is the document object work with the html element instead
|
12412
12410
|
// this makes $(document).scope() possible
|
12413
|
-
if(element
|
12414
|
-
element = element.
|
12411
|
+
if(element.nodeType == 9) {
|
12412
|
+
element = element.documentElement;
|
12415
12413
|
}
|
12416
12414
|
var names = isArray(name) ? name : [name];
|
12417
12415
|
|
12418
|
-
while (element
|
12419
|
-
var node = element[0];
|
12416
|
+
while (element) {
|
12420
12417
|
for (var i = 0, ii = names.length; i < ii; i++) {
|
12421
|
-
if ((value =
|
12418
|
+
if ((value = jqLite.data(element, names[i])) !== undefined) return value;
|
12422
12419
|
}
|
12423
12420
|
|
12424
12421
|
// If dealing with a document fragment node with a host element, and no parent, use the host
|
12425
12422
|
// element as the parent. This enables directives within a Shadow DOM or polyfilled Shadow DOM
|
12426
12423
|
// to lookup parent controllers.
|
12427
|
-
element =
|
12424
|
+
element = element.parentNode || (element.nodeType === 11 && element.host);
|
12428
12425
|
}
|
12429
12426
|
}
|
12430
12427
|
|
@@ -12507,18 +12504,25 @@ function getAliasedAttrName(element, name) {
|
|
12507
12504
|
return (nodeName === 'INPUT' || nodeName === 'TEXTAREA') && ALIASED_ATTR[name];
|
12508
12505
|
}
|
12509
12506
|
|
12507
|
+
forEach({
|
12508
|
+
data: jqLiteData,
|
12509
|
+
removeData: jqLiteRemoveData
|
12510
|
+
}, function(fn, name) {
|
12511
|
+
JQLite[name] = fn;
|
12512
|
+
});
|
12513
|
+
|
12510
12514
|
forEach({
|
12511
12515
|
data: jqLiteData,
|
12512
12516
|
inheritedData: jqLiteInheritedData,
|
12513
12517
|
|
12514
12518
|
scope: function(element) {
|
12515
12519
|
// Can't use jqLiteData here directly so we stay compatible with jQuery!
|
12516
|
-
return jqLite
|
12520
|
+
return jqLite.data(element, '$scope') || jqLiteInheritedData(element.parentNode || element, ['$isolateScope', '$scope']);
|
12517
12521
|
},
|
12518
12522
|
|
12519
12523
|
isolateScope: function(element) {
|
12520
12524
|
// Can't use jqLiteData here directly so we stay compatible with jQuery!
|
12521
|
-
return jqLite
|
12525
|
+
return jqLite.data(element, '$isolateScope') || jqLite.data(element, '$isolateScopeNoTemplate');
|
12522
12526
|
},
|
12523
12527
|
|
12524
12528
|
controller: jqLiteController,
|
@@ -12939,7 +12943,9 @@ forEach({
|
|
12939
12943
|
clone: jqLiteClone,
|
12940
12944
|
|
12941
12945
|
triggerHandler: function(element, eventName, eventData) {
|
12942
|
-
|
12946
|
+
// Copy event handlers in case event handlers array is modified during execution.
|
12947
|
+
var eventFns = (jqLiteExpandoStore(element, 'events') || {})[eventName],
|
12948
|
+
eventFnsCopy = shallowCopy(eventFns || []);
|
12943
12949
|
|
12944
12950
|
eventData = eventData || [];
|
12945
12951
|
|
@@ -12953,7 +12959,7 @@ forEach({
|
|
12953
12959
|
stopPropagation: noop
|
12954
12960
|
}];
|
12955
12961
|
|
12956
|
-
forEach(
|
12962
|
+
forEach(eventFnsCopy, function(fn) {
|
12957
12963
|
fn.apply(element, event.concat(eventData));
|
12958
12964
|
});
|
12959
12965
|
}
|
@@ -13076,7 +13082,7 @@ HashMap.prototype = {
|
|
13076
13082
|
*
|
13077
13083
|
* // use the injector to kick off your application
|
13078
13084
|
* // use the type inference to auto inject arguments, or use implicit injection
|
13079
|
-
* $injector.invoke(function($rootScope, $compile, $document){
|
13085
|
+
* $injector.invoke(function($rootScope, $compile, $document) {
|
13080
13086
|
* $compile($document)($rootScope);
|
13081
13087
|
* $rootScope.$digest();
|
13082
13088
|
* });
|
@@ -13150,8 +13156,8 @@ function annotate(fn, strictDi, name) {
|
|
13150
13156
|
}
|
13151
13157
|
fnText = fn.toString().replace(STRIP_COMMENTS, '');
|
13152
13158
|
argDecl = fnText.match(FN_ARGS);
|
13153
|
-
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg){
|
13154
|
-
arg.replace(FN_ARG, function(all, underscore, name){
|
13159
|
+
forEach(argDecl[1].split(FN_ARG_SPLIT), function(arg) {
|
13160
|
+
arg.replace(FN_ARG, function(all, underscore, name) {
|
13155
13161
|
$inject.push(name);
|
13156
13162
|
});
|
13157
13163
|
});
|
@@ -13186,7 +13192,7 @@ function annotate(fn, strictDi, name) {
|
|
13186
13192
|
* ```js
|
13187
13193
|
* var $injector = angular.injector();
|
13188
13194
|
* expect($injector.get('$injector')).toBe($injector);
|
13189
|
-
* expect($injector.invoke(function($injector){
|
13195
|
+
* expect($injector.invoke(function($injector) {
|
13190
13196
|
* return $injector;
|
13191
13197
|
* }).toBe($injector);
|
13192
13198
|
* ```
|
@@ -13822,7 +13828,7 @@ function createInjector(modulesToLoad, strictDi) {
|
|
13822
13828
|
}
|
13823
13829
|
}
|
13824
13830
|
|
13825
|
-
function invoke(fn, self, locals, serviceName){
|
13831
|
+
function invoke(fn, self, locals, serviceName) {
|
13826
13832
|
if (typeof locals === 'string') {
|
13827
13833
|
serviceName = locals;
|
13828
13834
|
locals = null;
|
@@ -14521,16 +14527,15 @@ function Browser(window, document, $log, $sniffer) {
|
|
14521
14527
|
* @returns {Object} Hash of all cookies (if called without any parameter)
|
14522
14528
|
*/
|
14523
14529
|
self.cookies = function(name, value) {
|
14524
|
-
/* global escape: false, unescape: false */
|
14525
14530
|
var cookieLength, cookieArray, cookie, i, index;
|
14526
14531
|
|
14527
14532
|
if (name) {
|
14528
14533
|
if (value === undefined) {
|
14529
|
-
rawDocument.cookie =
|
14534
|
+
rawDocument.cookie = encodeURIComponent(name) + "=;path=" + cookiePath +
|
14530
14535
|
";expires=Thu, 01 Jan 1970 00:00:00 GMT";
|
14531
14536
|
} else {
|
14532
14537
|
if (isString(value)) {
|
14533
|
-
cookieLength = (rawDocument.cookie =
|
14538
|
+
cookieLength = (rawDocument.cookie = encodeURIComponent(name) + '=' + encodeURIComponent(value) +
|
14534
14539
|
';path=' + cookiePath).length + 1;
|
14535
14540
|
|
14536
14541
|
// per http://www.ietf.org/rfc/rfc2109.txt browser must allow at minimum:
|
@@ -14554,12 +14559,12 @@ function Browser(window, document, $log, $sniffer) {
|
|
14554
14559
|
cookie = cookieArray[i];
|
14555
14560
|
index = cookie.indexOf('=');
|
14556
14561
|
if (index > 0) { //ignore nameless cookies
|
14557
|
-
name =
|
14562
|
+
name = decodeURIComponent(cookie.substring(0, index));
|
14558
14563
|
// the first value that is seen for a cookie is the most
|
14559
14564
|
// specific one. values for the same cookie name that
|
14560
14565
|
// follow are for less specific paths.
|
14561
14566
|
if (lastCookies[name] === undefined) {
|
14562
|
-
lastCookies[name] =
|
14567
|
+
lastCookies[name] = decodeURIComponent(cookie.substring(index + 1));
|
14563
14568
|
}
|
14564
14569
|
}
|
14565
14570
|
}
|
@@ -15132,6 +15137,13 @@ function $TemplateCacheProvider() {
|
|
15132
15137
|
* The directive definition object provides instructions to the {@link ng.$compile
|
15133
15138
|
* compiler}. The attributes are:
|
15134
15139
|
*
|
15140
|
+
* ### `multiElement`
|
15141
|
+
* When this property is set to true, the HTML compiler will collect DOM nodes between
|
15142
|
+
* nodes with the attributes `directive-name-start` and `directive-name-end`, and group them
|
15143
|
+
* together as the directive elements. It is recomended that this feature be used on directives
|
15144
|
+
* which are not strictly behavioural (such as {@link api/ng.directive:ngClick ngClick}), and which
|
15145
|
+
* do not manipulate or replace child nodes (such as {@link api/ng.directive:ngInclude ngInclude}).
|
15146
|
+
*
|
15135
15147
|
* #### `priority`
|
15136
15148
|
* When there are multiple directives defined on a single DOM element, sometimes it
|
15137
15149
|
* is necessary to specify the order in which the directives are applied. The `priority` is used
|
@@ -15227,7 +15239,7 @@ function $TemplateCacheProvider() {
|
|
15227
15239
|
* String of subset of `EACM` which restricts the directive to a specific directive
|
15228
15240
|
* declaration style. If omitted, the default (attributes only) is used.
|
15229
15241
|
*
|
15230
|
-
* * `E` - Element name: `<my-directive></my-directive>`
|
15242
|
+
* * `E` - Element name (default): `<my-directive></my-directive>`
|
15231
15243
|
* * `A` - Attribute (default): `<div my-directive="exp"></div>`
|
15232
15244
|
* * `C` - Class: `<div class="my-directive: exp;"></div>`
|
15233
15245
|
* * `M` - Comment: `<!-- directive: my-directive exp -->`
|
@@ -15247,14 +15259,16 @@ function $TemplateCacheProvider() {
|
|
15247
15259
|
* If no `type` is specified, then the type is considered to be html.
|
15248
15260
|
*
|
15249
15261
|
* #### `template`
|
15250
|
-
*
|
15251
|
-
*
|
15252
|
-
*
|
15253
|
-
*
|
15262
|
+
* HTML markup that may:
|
15263
|
+
* * Replace the contents of the directive's element (defualt).
|
15264
|
+
* * Replace the directive's element itself (if `replace` is true - DEPRECATED).
|
15265
|
+
* * Wrap the contents of the directive's element (if `transclude` is true).
|
15266
|
+
*
|
15267
|
+
* Value may be:
|
15254
15268
|
*
|
15255
|
-
*
|
15256
|
-
* two arguments `tElement` and `tAttrs` (described in the `compile`
|
15257
|
-
* returns a string value
|
15269
|
+
* * A string. For example `<div red-on-hover>{{delete_str}}</div>`.
|
15270
|
+
* * A function which takes two arguments `tElement` and `tAttrs` (described in the `compile`
|
15271
|
+
* function api below) and returns a string value.
|
15258
15272
|
*
|
15259
15273
|
*
|
15260
15274
|
* #### `templateUrl`
|
@@ -15269,11 +15283,14 @@ function $TemplateCacheProvider() {
|
|
15269
15283
|
*
|
15270
15284
|
*
|
15271
15285
|
* #### `replace` ([*DEPRECATED*!], will be removed in next major release)
|
15272
|
-
* specify
|
15286
|
+
* specify what the template should replace. Defaults to `false`.
|
15273
15287
|
*
|
15274
|
-
* * `true` - the template will replace the
|
15275
|
-
* * `false` - the template will replace the contents of the
|
15288
|
+
* * `true` - the template will replace the directive's element.
|
15289
|
+
* * `false` - the template will replace the contents of the directive's element.
|
15276
15290
|
*
|
15291
|
+
* The replacement process migrates all of the attributes / classes from the old element to the new
|
15292
|
+
* one. See the {@link guide/directive#creating-custom-directives_creating-directives_template-expanding-directive
|
15293
|
+
* Directives Guide} for an example.
|
15277
15294
|
*
|
15278
15295
|
* #### `transclude`
|
15279
15296
|
* compile the content of the element and make it available to the directive.
|
@@ -15287,6 +15304,11 @@ function $TemplateCacheProvider() {
|
|
15287
15304
|
* * `true` - transclude the content of the directive.
|
15288
15305
|
* * `'element'` - transclude the whole element including any directives defined at lower priority.
|
15289
15306
|
*
|
15307
|
+
* <div class="alert alert-warning">
|
15308
|
+
* **Note:** When testing an element transclude directive you must not place the directive at the root of the
|
15309
|
+
* DOM fragment that is being compiled. See {@link guide/unit-testing#testing-transclusion-directives
|
15310
|
+
* Testing Transclusion Directives}.
|
15311
|
+
* </div>
|
15290
15312
|
*
|
15291
15313
|
* #### `compile`
|
15292
15314
|
*
|
@@ -15585,7 +15607,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15585
15607
|
directive.index = index;
|
15586
15608
|
directive.name = directive.name || name;
|
15587
15609
|
directive.require = directive.require || (directive.controller && directive.name);
|
15588
|
-
directive.restrict = directive.restrict || '
|
15610
|
+
directive.restrict = directive.restrict || 'EA';
|
15589
15611
|
directives.push(directive);
|
15590
15612
|
} catch (e) {
|
15591
15613
|
$exceptionHandler(e);
|
@@ -15935,7 +15957,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15935
15957
|
: null;
|
15936
15958
|
|
15937
15959
|
if (nodeLinkFn && nodeLinkFn.scope) {
|
15938
|
-
safeAddClass(
|
15960
|
+
safeAddClass(attrs.$$element, 'ng-scope');
|
15939
15961
|
}
|
15940
15962
|
|
15941
15963
|
childLinkFn = (nodeLinkFn && nodeLinkFn.terminal ||
|
@@ -15957,7 +15979,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15957
15979
|
return linkFnFound ? compositeLinkFn : null;
|
15958
15980
|
|
15959
15981
|
function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {
|
15960
|
-
var nodeLinkFn, childLinkFn, node,
|
15982
|
+
var nodeLinkFn, childLinkFn, node, childScope, i, ii, n, childBoundTranscludeFn;
|
15961
15983
|
|
15962
15984
|
// copy nodeList so that linking doesn't break due to live list updates.
|
15963
15985
|
var nodeListLength = nodeList.length,
|
@@ -15970,12 +15992,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15970
15992
|
node = stableNodeList[n];
|
15971
15993
|
nodeLinkFn = linkFns[i++];
|
15972
15994
|
childLinkFn = linkFns[i++];
|
15973
|
-
$node = jqLite(node);
|
15974
15995
|
|
15975
15996
|
if (nodeLinkFn) {
|
15976
15997
|
if (nodeLinkFn.scope) {
|
15977
15998
|
childScope = scope.$new();
|
15978
|
-
|
15999
|
+
jqLite.data(node, '$scope', childScope);
|
15979
16000
|
} else {
|
15980
16001
|
childScope = scope;
|
15981
16002
|
}
|
@@ -16063,10 +16084,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16063
16084
|
}
|
16064
16085
|
|
16065
16086
|
var directiveNName = ngAttrName.replace(/(Start|End)$/, '');
|
16066
|
-
if (
|
16067
|
-
|
16068
|
-
|
16069
|
-
|
16087
|
+
if (directiveIsMultiElement(directiveNName)) {
|
16088
|
+
if (ngAttrName === directiveNName + 'Start') {
|
16089
|
+
attrStartName = name;
|
16090
|
+
attrEndName = name.substr(0, name.length - 5) + 'end';
|
16091
|
+
name = name.substr(0, name.length - 6);
|
16092
|
+
}
|
16070
16093
|
}
|
16071
16094
|
|
16072
16095
|
nName = directiveNormalize(name.toLowerCase());
|
@@ -16275,12 +16298,12 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16275
16298
|
if (directiveValue == 'element') {
|
16276
16299
|
hasElementTranscludeDirective = true;
|
16277
16300
|
terminalPriority = directive.priority;
|
16278
|
-
$template =
|
16301
|
+
$template = $compileNode;
|
16279
16302
|
$compileNode = templateAttrs.$$element =
|
16280
16303
|
jqLite(document.createComment(' ' + directiveName + ': ' +
|
16281
16304
|
templateAttrs[directiveName] + ' '));
|
16282
16305
|
compileNode = $compileNode[0];
|
16283
|
-
replaceWith(jqCollection,
|
16306
|
+
replaceWith(jqCollection, sliceArgs($template), compileNode);
|
16284
16307
|
|
16285
16308
|
childTranscludeFn = compile($template, transcludeFn, terminalPriority,
|
16286
16309
|
replaceDirective && replaceDirective.name, {
|
@@ -16457,29 +16480,26 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16457
16480
|
function nodeLinkFn(childLinkFn, scope, linkNode, $rootElement, boundTranscludeFn) {
|
16458
16481
|
var attrs, $element, i, ii, linkFn, controller, isolateScope, elementControllers = {}, transcludeFn;
|
16459
16482
|
|
16460
|
-
|
16461
|
-
|
16462
|
-
|
16463
|
-
attrs = shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
|
16464
|
-
}
|
16483
|
+
attrs = (compileNode === linkNode)
|
16484
|
+
? templateAttrs
|
16485
|
+
: shallowCopy(templateAttrs, new Attributes(jqLite(linkNode), templateAttrs.$attr));
|
16465
16486
|
$element = attrs.$$element;
|
16466
16487
|
|
16467
16488
|
if (newIsolateScopeDirective) {
|
16468
16489
|
var LOCAL_REGEXP = /^\s*([@=&])(\??)\s*(\w*)\s*$/;
|
16469
|
-
var $linkNode = jqLite(linkNode);
|
16470
16490
|
|
16471
16491
|
isolateScope = scope.$new(true);
|
16472
16492
|
|
16473
16493
|
if (templateDirective && (templateDirective === newIsolateScopeDirective ||
|
16474
16494
|
templateDirective === newIsolateScopeDirective.$$originalDirective)) {
|
16475
|
-
$
|
16495
|
+
$element.data('$isolateScope', isolateScope);
|
16476
16496
|
} else {
|
16477
|
-
$
|
16497
|
+
$element.data('$isolateScopeNoTemplate', isolateScope);
|
16478
16498
|
}
|
16479
16499
|
|
16480
16500
|
|
16481
16501
|
|
16482
|
-
safeAddClass($
|
16502
|
+
safeAddClass($element, 'ng-isolate-scope');
|
16483
16503
|
|
16484
16504
|
forEach(newIsolateScopeDirective.scope, function(definition, scopeName) {
|
16485
16505
|
var match = definition.match(LOCAL_REGEXP) || [],
|
@@ -16523,8 +16543,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16523
16543
|
attrs[attrName], newIsolateScopeDirective.name);
|
16524
16544
|
};
|
16525
16545
|
lastValue = isolateScope[scopeName] = parentGet(scope);
|
16526
|
-
|
16527
|
-
var parentValue = parentGet(scope);
|
16546
|
+
var unwatch = scope.$watch($parse(attrs[attrName], function parentValueWatch(parentValue) {
|
16528
16547
|
if (!compare(parentValue, isolateScope[scopeName])) {
|
16529
16548
|
// we are out of sync and need to copy
|
16530
16549
|
if (!compare(parentValue, lastValue)) {
|
@@ -16535,9 +16554,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16535
16554
|
parentSet(scope, parentValue = isolateScope[scopeName]);
|
16536
16555
|
}
|
16537
16556
|
}
|
16538
|
-
parentValueWatch.$$unwatch = parentGet.$$unwatch;
|
16539
16557
|
return lastValue = parentValue;
|
16540
|
-
}, null, parentGet.literal);
|
16558
|
+
}), null, parentGet.literal);
|
16559
|
+
isolateScope.$on('$destroy', unwatch);
|
16541
16560
|
break;
|
16542
16561
|
|
16543
16562
|
case '&':
|
@@ -16682,6 +16701,27 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16682
16701
|
}
|
16683
16702
|
|
16684
16703
|
|
16704
|
+
/**
|
16705
|
+
* looks up the directive and returns true if it is a multi-element directive,
|
16706
|
+
* and therefore requires DOM nodes between -start and -end markers to be grouped
|
16707
|
+
* together.
|
16708
|
+
*
|
16709
|
+
* @param {string} name name of the directive to look up.
|
16710
|
+
* @returns true if directive was registered as multi-element.
|
16711
|
+
*/
|
16712
|
+
function directiveIsMultiElement(name) {
|
16713
|
+
if (hasDirectives.hasOwnProperty(name)) {
|
16714
|
+
for(var directive, directives = $injector.get(name + Suffix),
|
16715
|
+
i = 0, ii = directives.length; i<ii; i++) {
|
16716
|
+
directive = directives[i];
|
16717
|
+
if (directive.multiElement) {
|
16718
|
+
return true;
|
16719
|
+
}
|
16720
|
+
}
|
16721
|
+
}
|
16722
|
+
return false;
|
16723
|
+
}
|
16724
|
+
|
16685
16725
|
/**
|
16686
16726
|
* When the element is replaced with HTML template then the new attributes
|
16687
16727
|
* on the template need to be merged with the existing attributes in the DOM.
|
@@ -16873,9 +16913,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16873
16913
|
return function textInterpolateLinkFn(scope, node) {
|
16874
16914
|
var parent = node.parent(),
|
16875
16915
|
bindings = parent.data('$binding') || [];
|
16876
|
-
// Need to interpolate again in case this is using one-time bindings in multiple clones
|
16877
|
-
// of transcluded templates.
|
16878
|
-
interpolateFn = $interpolate(text);
|
16879
16916
|
bindings.push(interpolateFn);
|
16880
16917
|
parent.data('$binding', bindings);
|
16881
16918
|
if (!hasCompileParent) safeAddClass(parent, 'ng-binding');
|
@@ -17317,11 +17354,7 @@ function parseHeaders(headers) {
|
|
17317
17354
|
val = trim(line.substr(i + 1));
|
17318
17355
|
|
17319
17356
|
if (key) {
|
17320
|
-
|
17321
|
-
parsed[key] += ', ' + val;
|
17322
|
-
} else {
|
17323
|
-
parsed[key] = val;
|
17324
|
-
}
|
17357
|
+
parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;
|
17325
17358
|
}
|
17326
17359
|
});
|
17327
17360
|
|
@@ -18086,7 +18119,7 @@ function $HttpProvider() {
|
|
18086
18119
|
* Shortcut method to perform `JSONP` request.
|
18087
18120
|
*
|
18088
18121
|
* @param {string} url Relative or absolute URL specifying the destination of the request.
|
18089
|
-
*
|
18122
|
+
* The name of the callback should be the string `JSON_CALLBACK`.
|
18090
18123
|
* @param {Object=} config Optional configuration object
|
18091
18124
|
* @returns {HttpPromise} Future object
|
18092
18125
|
*/
|
@@ -18120,8 +18153,7 @@ function $HttpProvider() {
|
|
18120
18153
|
|
18121
18154
|
/**
|
18122
18155
|
* @ngdoc method
|
18123
|
-
* @name
|
18124
|
-
* @methodOf ng.$http
|
18156
|
+
* @name $http#patch
|
18125
18157
|
*
|
18126
18158
|
* @description
|
18127
18159
|
* Shortcut method to perform `PATCH` request.
|
@@ -18200,7 +18232,7 @@ function $HttpProvider() {
|
|
18200
18232
|
if (cache) {
|
18201
18233
|
cachedResp = cache.get(url);
|
18202
18234
|
if (isDefined(cachedResp)) {
|
18203
|
-
if (cachedResp
|
18235
|
+
if (isPromiseLike(cachedResp)) {
|
18204
18236
|
// cached request has already been sent, but there is no response yet
|
18205
18237
|
cachedResp.then(removePendingReq, removePendingReq);
|
18206
18238
|
return cachedResp;
|
@@ -18282,27 +18314,29 @@ function $HttpProvider() {
|
|
18282
18314
|
|
18283
18315
|
|
18284
18316
|
function buildUrl(url, params) {
|
18285
|
-
|
18286
|
-
|
18287
|
-
|
18288
|
-
|
18289
|
-
|
18290
|
-
|
18291
|
-
|
18292
|
-
|
18293
|
-
|
18294
|
-
|
18295
|
-
|
18296
|
-
|
18297
|
-
}
|
18298
|
-
});
|
18299
|
-
if(parts.length > 0) {
|
18300
|
-
url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
|
18317
|
+
if (!params) return url;
|
18318
|
+
var parts = [];
|
18319
|
+
forEachSorted(params, function(value, key) {
|
18320
|
+
if (value === null || isUndefined(value)) return;
|
18321
|
+
if (!isArray(value)) value = [value];
|
18322
|
+
|
18323
|
+
forEach(value, function(v) {
|
18324
|
+
if (isObject(v)) {
|
18325
|
+
if (isDate(v)){
|
18326
|
+
v = v.toISOString();
|
18327
|
+
} else if (isObject(v)) {
|
18328
|
+
v = toJson(v);
|
18329
|
+
}
|
18301
18330
|
}
|
18302
|
-
|
18303
|
-
|
18304
|
-
|
18305
|
-
|
18331
|
+
parts.push(encodeUriQuery(key) + '=' +
|
18332
|
+
encodeUriQuery(v));
|
18333
|
+
});
|
18334
|
+
});
|
18335
|
+
if(parts.length > 0) {
|
18336
|
+
url += ((url.indexOf('?') == -1) ? '?' : '&') + parts.join('&');
|
18337
|
+
}
|
18338
|
+
return url;
|
18339
|
+
}
|
18306
18340
|
}];
|
18307
18341
|
}
|
18308
18342
|
|
@@ -18438,7 +18472,7 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18438
18472
|
|
18439
18473
|
if (timeout > 0) {
|
18440
18474
|
var timeoutId = $browserDefer(timeoutRequest, timeout);
|
18441
|
-
} else if (timeout
|
18475
|
+
} else if (isPromiseLike(timeout)) {
|
18442
18476
|
timeout.then(timeoutRequest);
|
18443
18477
|
}
|
18444
18478
|
|
@@ -18632,9 +18666,9 @@ function $InterpolateProvider() {
|
|
18632
18666
|
*
|
18633
18667
|
* // "allOrNothing" mode
|
18634
18668
|
* exp = $interpolate('{{greeting}} {{name}}!', false, null, true);
|
18635
|
-
* expect(exp(context
|
18669
|
+
* expect(exp(context)).toBeUndefined();
|
18636
18670
|
* context.name = 'Angular';
|
18637
|
-
* expect(exp(context
|
18671
|
+
* expect(exp(context)).toEqual('Hello Angular!');
|
18638
18672
|
* ```
|
18639
18673
|
*
|
18640
18674
|
* `allOrNothing` is useful for interpolating URLs. `ngSrc` and `ngSrcset` use this behavior.
|
@@ -18702,8 +18736,7 @@ function $InterpolateProvider() {
|
|
18702
18736
|
hasInterpolation = false,
|
18703
18737
|
hasText = false,
|
18704
18738
|
exp,
|
18705
|
-
concat = []
|
18706
|
-
lastValuesCache = { values: {}, results: {}};
|
18739
|
+
concat = [];
|
18707
18740
|
|
18708
18741
|
while(index < textLength) {
|
18709
18742
|
if ( ((startIndex = text.indexOf(startSymbol, index)) != -1) &&
|
@@ -18712,7 +18745,7 @@ function $InterpolateProvider() {
|
|
18712
18745
|
separators.push(text.substring(index, startIndex));
|
18713
18746
|
exp = text.substring(startIndex + startSymbolLength, endIndex);
|
18714
18747
|
expressions.push(exp);
|
18715
|
-
parseFns.push($parse(exp));
|
18748
|
+
parseFns.push($parse(exp, parseStringifyInterceptor));
|
18716
18749
|
index = endIndex + endSymbolLength;
|
18717
18750
|
hasInterpolation = true;
|
18718
18751
|
} else {
|
@@ -18753,6 +18786,7 @@ function $InterpolateProvider() {
|
|
18753
18786
|
|
18754
18787
|
var compute = function(values) {
|
18755
18788
|
for(var i = 0, ii = expressions.length; i < ii; i++) {
|
18789
|
+
if (allOrNothing && isUndefined(values[i])) return;
|
18756
18790
|
concat[2*i] = separators[i];
|
18757
18791
|
concat[(2*i)+1] = values[i];
|
18758
18792
|
}
|
@@ -18761,13 +18795,9 @@ function $InterpolateProvider() {
|
|
18761
18795
|
};
|
18762
18796
|
|
18763
18797
|
var getValue = function (value) {
|
18764
|
-
|
18765
|
-
|
18766
|
-
|
18767
|
-
value = $sce.valueOf(value);
|
18768
|
-
}
|
18769
|
-
|
18770
|
-
return value;
|
18798
|
+
return trustedContext ?
|
18799
|
+
$sce.getTrusted(trustedContext, value) :
|
18800
|
+
$sce.valueOf(value);
|
18771
18801
|
};
|
18772
18802
|
|
18773
18803
|
var stringify = function (value) {
|
@@ -18791,64 +18821,49 @@ function $InterpolateProvider() {
|
|
18791
18821
|
};
|
18792
18822
|
|
18793
18823
|
return extend(function interpolationFn(context) {
|
18794
|
-
var scopeId = (context && context.$id) || 'notAScope';
|
18795
|
-
var lastValues = lastValuesCache.values[scopeId];
|
18796
|
-
var lastResult = lastValuesCache.results[scopeId];
|
18797
18824
|
var i = 0;
|
18798
18825
|
var ii = expressions.length;
|
18799
18826
|
var values = new Array(ii);
|
18800
|
-
var val;
|
18801
|
-
var inputsChanged = lastResult === undefined ? true: false;
|
18802
|
-
|
18803
|
-
|
18804
|
-
// if we haven't seen this context before, initialize the cache and try to setup
|
18805
|
-
// a cleanup routine that purges the cache when the scope goes away.
|
18806
|
-
if (!lastValues) {
|
18807
|
-
lastValues = [];
|
18808
|
-
inputsChanged = true;
|
18809
|
-
if (context && context.$on) {
|
18810
|
-
context.$on('$destroy', function() {
|
18811
|
-
lastValuesCache.values[scopeId] = null;
|
18812
|
-
lastValuesCache.results[scopeId] = null;
|
18813
|
-
});
|
18814
|
-
}
|
18815
|
-
}
|
18816
|
-
|
18817
18827
|
|
18818
18828
|
try {
|
18819
|
-
interpolationFn.$$unwatch = true;
|
18820
18829
|
for (; i < ii; i++) {
|
18821
|
-
|
18822
|
-
if (allOrNothing && isUndefined(val)) {
|
18823
|
-
interpolationFn.$$unwatch = undefined;
|
18824
|
-
return;
|
18825
|
-
}
|
18826
|
-
val = stringify(val);
|
18827
|
-
if (val !== lastValues[i]) {
|
18828
|
-
inputsChanged = true;
|
18829
|
-
}
|
18830
|
-
values[i] = val;
|
18831
|
-
interpolationFn.$$unwatch = interpolationFn.$$unwatch && parseFns[i].$$unwatch;
|
18830
|
+
values[i] = parseFns[i](context);
|
18832
18831
|
}
|
18833
18832
|
|
18834
|
-
|
18835
|
-
lastValuesCache.values[scopeId] = values;
|
18836
|
-
lastValuesCache.results[scopeId] = lastResult = compute(values);
|
18837
|
-
}
|
18833
|
+
return compute(values);
|
18838
18834
|
} catch(err) {
|
18839
18835
|
var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
|
18840
18836
|
err.toString());
|
18841
18837
|
$exceptionHandler(newErr);
|
18842
18838
|
}
|
18843
18839
|
|
18844
|
-
return lastResult;
|
18845
18840
|
}, {
|
18846
18841
|
// all of these properties are undocumented for now
|
18847
18842
|
exp: text, //just for compatibility with regular watchers created via $watch
|
18848
18843
|
separators: separators,
|
18849
|
-
expressions: expressions
|
18844
|
+
expressions: expressions,
|
18845
|
+
$$watchDelegate: function (scope, listener, objectEquality, deregisterNotifier) {
|
18846
|
+
var lastValue;
|
18847
|
+
return scope.$watchGroup(parseFns, function interpolateFnWatcher(values, oldValues) {
|
18848
|
+
var currValue = compute(values);
|
18849
|
+
if (isFunction(listener)) {
|
18850
|
+
listener.call(this, currValue, values !== oldValues ? lastValue : currValue, scope);
|
18851
|
+
}
|
18852
|
+
lastValue = currValue;
|
18853
|
+
}, objectEquality, deregisterNotifier);
|
18854
|
+
}
|
18850
18855
|
});
|
18851
18856
|
}
|
18857
|
+
|
18858
|
+
function parseStringifyInterceptor(value) {
|
18859
|
+
try {
|
18860
|
+
return stringify(getValue(value));
|
18861
|
+
} catch(err) {
|
18862
|
+
var newErr = $interpolateMinErr('interr', "Can't interpolate: {0}\n{1}", text,
|
18863
|
+
err.toString());
|
18864
|
+
$exceptionHandler(newErr);
|
18865
|
+
}
|
18866
|
+
}
|
18852
18867
|
}
|
18853
18868
|
|
18854
18869
|
|
@@ -18969,7 +18984,7 @@ function $IntervalProvider() {
|
|
18969
18984
|
* // Make sure that the interval nis destroyed too
|
18970
18985
|
* $scope.stopFight();
|
18971
18986
|
* });
|
18972
|
-
* })
|
18987
|
+
* }])
|
18973
18988
|
* // Register the 'myCurrentTime' directive factory method.
|
18974
18989
|
* // We inject $interval and dateFilter service since the factory method is DI.
|
18975
18990
|
* .directive('myCurrentTime', ['$interval', 'dateFilter',
|
@@ -18998,7 +19013,7 @@ function $IntervalProvider() {
|
|
18998
19013
|
* $interval.cancel(stopTime);
|
18999
19014
|
* });
|
19000
19015
|
* }
|
19001
|
-
* });
|
19016
|
+
* }]);
|
19002
19017
|
* </script>
|
19003
19018
|
*
|
19004
19019
|
* <div>
|
@@ -20414,11 +20429,7 @@ Lexer.prototype = {
|
|
20414
20429
|
string += String.fromCharCode(parseInt(hex, 16));
|
20415
20430
|
} else {
|
20416
20431
|
var rep = ESCAPE[ch];
|
20417
|
-
|
20418
|
-
string += rep;
|
20419
|
-
} else {
|
20420
|
-
string += ch;
|
20421
|
-
}
|
20432
|
+
string = string + (rep || ch);
|
20422
20433
|
}
|
20423
20434
|
escape = false;
|
20424
20435
|
} else if (ch === '\\') {
|
@@ -20979,7 +20990,7 @@ function getterFn(path, options, fullExp) {
|
|
20979
20990
|
// we simply dereference 's' on any .dot notation
|
20980
20991
|
? 's'
|
20981
20992
|
// but if we are first then we check locals first, and if so read it first
|
20982
|
-
: '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '
|
20993
|
+
: '((k&&k.hasOwnProperty("' + key + '"))?k:s)') + '.' + key + ';\n';
|
20983
20994
|
});
|
20984
20995
|
code += 'return s;';
|
20985
20996
|
|
@@ -21061,69 +21072,89 @@ function $ParseProvider() {
|
|
21061
21072
|
this.$get = ['$filter', '$sniffer', function($filter, $sniffer) {
|
21062
21073
|
$parseOptions.csp = $sniffer.csp;
|
21063
21074
|
|
21064
|
-
return function(exp) {
|
21065
|
-
var parsedExpression,
|
21066
|
-
|
21075
|
+
return function(exp, interceptorFn) {
|
21076
|
+
var parsedExpression, oneTime,
|
21077
|
+
cacheKey = (exp = trim(exp));
|
21067
21078
|
|
21068
21079
|
switch (typeof exp) {
|
21069
21080
|
case 'string':
|
21081
|
+
if (cache.hasOwnProperty(cacheKey)) {
|
21082
|
+
parsedExpression = cache[cacheKey];
|
21083
|
+
} else {
|
21084
|
+
if (exp.charAt(0) === ':' && exp.charAt(1) === ':') {
|
21085
|
+
oneTime = true;
|
21086
|
+
exp = exp.substring(2);
|
21087
|
+
}
|
21070
21088
|
|
21071
|
-
|
21072
|
-
|
21073
|
-
|
21074
|
-
oneTime = true;
|
21075
|
-
exp = exp.substring(2);
|
21076
|
-
}
|
21077
|
-
|
21078
|
-
if (cache.hasOwnProperty(exp)) {
|
21079
|
-
return oneTime ? oneTimeWrapper(cache[exp]) : cache[exp];
|
21080
|
-
}
|
21089
|
+
var lexer = new Lexer($parseOptions);
|
21090
|
+
var parser = new Parser(lexer, $filter, $parseOptions);
|
21091
|
+
parsedExpression = parser.parse(exp);
|
21081
21092
|
|
21082
|
-
|
21083
|
-
|
21084
|
-
parsedExpression = parser.parse(exp);
|
21093
|
+
if (parsedExpression.constant) parsedExpression.$$watchDelegate = constantWatch;
|
21094
|
+
else if (oneTime) parsedExpression.$$watchDelegate = oneTimeWatch;
|
21085
21095
|
|
21086
|
-
|
21087
|
-
|
21088
|
-
|
21089
|
-
|
21096
|
+
if (cacheKey !== 'hasOwnProperty') {
|
21097
|
+
// Only cache the value if it's not going to mess up the cache object
|
21098
|
+
// This is more performant that using Object.prototype.hasOwnProperty.call
|
21099
|
+
cache[cacheKey] = parsedExpression;
|
21100
|
+
}
|
21090
21101
|
}
|
21091
|
-
|
21092
|
-
return oneTime || parsedExpression.constant ? oneTimeWrapper(parsedExpression) : parsedExpression;
|
21102
|
+
return addInterceptor(parsedExpression, interceptorFn);
|
21093
21103
|
|
21094
21104
|
case 'function':
|
21095
|
-
return exp;
|
21105
|
+
return addInterceptor(exp, interceptorFn);
|
21096
21106
|
|
21097
21107
|
default:
|
21098
|
-
return noop;
|
21099
|
-
}
|
21100
|
-
|
21101
|
-
|
21102
|
-
|
21103
|
-
|
21104
|
-
|
21105
|
-
|
21106
|
-
|
21107
|
-
|
21108
|
-
|
21109
|
-
|
21110
|
-
|
21111
|
-
|
21112
|
-
|
21113
|
-
if (
|
21114
|
-
|
21115
|
-
// create a copy if the value is defined and it is not a $sce value
|
21116
|
-
if ((stable = isDefined(lastValue)) &&
|
21117
|
-
(lastValue === null || !lastValue.$$unwrapTrustedValue)) {
|
21118
|
-
lastValue = copy(lastValue, null);
|
21119
|
-
}
|
21120
|
-
});
|
21108
|
+
return addInterceptor(noop, interceptorFn);
|
21109
|
+
}
|
21110
|
+
};
|
21111
|
+
|
21112
|
+
function oneTimeWatch(scope, listener, objectEquality, deregisterNotifier, parsedExpression) {
|
21113
|
+
var unwatch, lastValue;
|
21114
|
+
return unwatch = scope.$watch(function oneTimeWatch(scope) {
|
21115
|
+
return parsedExpression(scope);
|
21116
|
+
}, function oneTimeListener(value, old, scope) {
|
21117
|
+
lastValue = value;
|
21118
|
+
if (isFunction(listener)) {
|
21119
|
+
listener.apply(this, arguments);
|
21120
|
+
}
|
21121
|
+
if (isDefined(value)) {
|
21122
|
+
scope.$$postDigest(function () {
|
21123
|
+
if (isDefined(lastValue)) {
|
21124
|
+
unwatch();
|
21121
21125
|
}
|
21122
|
-
}
|
21123
|
-
|
21126
|
+
});
|
21127
|
+
}
|
21128
|
+
}, objectEquality, deregisterNotifier);
|
21129
|
+
}
|
21130
|
+
|
21131
|
+
function constantWatch(scope, listener, objectEquality, deregisterNotifier, parsedExpression) {
|
21132
|
+
var unwatch;
|
21133
|
+
return unwatch = scope.$watch(function constantWatch(scope) {
|
21134
|
+
return parsedExpression(scope);
|
21135
|
+
}, function constantListener(value, old, scope) {
|
21136
|
+
if (isFunction(listener)) {
|
21137
|
+
listener.apply(this, arguments);
|
21124
21138
|
}
|
21139
|
+
unwatch();
|
21140
|
+
}, objectEquality, deregisterNotifier);
|
21141
|
+
}
|
21142
|
+
|
21143
|
+
function addInterceptor(parsedExpression, interceptorFn) {
|
21144
|
+
if (isFunction(interceptorFn)) {
|
21145
|
+
var fn = function interceptedExpression(scope, locals) {
|
21146
|
+
var value = parsedExpression(scope, locals);
|
21147
|
+
var result = interceptorFn(value, scope, locals);
|
21148
|
+
// we only return the interceptor's result if the
|
21149
|
+
// initial value is defined (for bind-once)
|
21150
|
+
return isDefined(value) ? result : value;
|
21151
|
+
};
|
21152
|
+
fn.$$watchDelegate = parsedExpression.$$watchDelegate;
|
21153
|
+
return fn;
|
21154
|
+
} else {
|
21155
|
+
return parsedExpression;
|
21125
21156
|
}
|
21126
|
-
}
|
21157
|
+
}
|
21127
21158
|
}];
|
21128
21159
|
}
|
21129
21160
|
|
@@ -21135,6 +21166,46 @@ function $ParseProvider() {
|
|
21135
21166
|
* @description
|
21136
21167
|
* A promise/deferred implementation inspired by [Kris Kowal's Q](https://github.com/kriskowal/q).
|
21137
21168
|
*
|
21169
|
+
* $q can be used in two fashions --- One, which is more similar to Kris Kowal's Q or jQuery's Deferred
|
21170
|
+
* implementations, the other resembles ES6 promises to some degree.
|
21171
|
+
*
|
21172
|
+
* # $q constructor
|
21173
|
+
*
|
21174
|
+
* The streamlined ES6 style promise is essentially just using $q as a constructor which takes a `resolver`
|
21175
|
+
* function as the first argument). This is similar to the native Promise implementation from ES6 Harmony,
|
21176
|
+
* see [MDN](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise).
|
21177
|
+
*
|
21178
|
+
* While the constructor-style use is supported, not all of the supporting methods from Harmony promises are
|
21179
|
+
* available yet.
|
21180
|
+
*
|
21181
|
+
* It can be used like so:
|
21182
|
+
*
|
21183
|
+
* ```js
|
21184
|
+
* return $q(function(resolve, reject) {
|
21185
|
+
* // perform some asynchronous operation, resolve or reject the promise when appropriate.
|
21186
|
+
* setInterval(function() {
|
21187
|
+
* if (pollStatus > 0) {
|
21188
|
+
* resolve(polledValue);
|
21189
|
+
* } else if (pollStatus < 0) {
|
21190
|
+
* reject(polledValue);
|
21191
|
+
* } else {
|
21192
|
+
* pollStatus = pollAgain(function(value) {
|
21193
|
+
* polledValue = value;
|
21194
|
+
* });
|
21195
|
+
* }
|
21196
|
+
* }, 10000);
|
21197
|
+
* }).
|
21198
|
+
* then(function(value) {
|
21199
|
+
* // handle success
|
21200
|
+
* }, function(reason) {
|
21201
|
+
* // handle failure
|
21202
|
+
* });
|
21203
|
+
* ```
|
21204
|
+
*
|
21205
|
+
* Note, progress/notify callbacks are not currently supported via the ES6-style interface.
|
21206
|
+
*
|
21207
|
+
* However, the more traditional CommonJS style usage is still available, and documented below.
|
21208
|
+
*
|
21138
21209
|
* [The CommonJS Promise proposal](http://wiki.commonjs.org/wiki/Promises) describes a promise as an
|
21139
21210
|
* interface for interacting with an object that represents the result of an action that is
|
21140
21211
|
* performed asynchronously, and may or may not be finished at any given point in time.
|
@@ -21181,7 +21252,6 @@ function $ParseProvider() {
|
|
21181
21252
|
* For more on this please see the [Q documentation](https://github.com/kriskowal/q) especially the
|
21182
21253
|
* section on serial or parallel joining of promises.
|
21183
21254
|
*
|
21184
|
-
*
|
21185
21255
|
* # The Deferred API
|
21186
21256
|
*
|
21187
21257
|
* A new instance of deferred is constructed by calling `$q.defer()`.
|
@@ -21290,6 +21360,12 @@ function $ParseProvider() {
|
|
21290
21360
|
* expect(resolvedValue).toEqual(123);
|
21291
21361
|
* }));
|
21292
21362
|
* ```
|
21363
|
+
*
|
21364
|
+
* @param {function(function, function)} resolver Function which is responsible for resolving or
|
21365
|
+
* rejecting the newly created promise. The first parameteter is a function which resolves the
|
21366
|
+
* promise, the second parameter is a function which rejects the promise.
|
21367
|
+
*
|
21368
|
+
* @returns {Promise} The newly created promise.
|
21293
21369
|
*/
|
21294
21370
|
function $QProvider() {
|
21295
21371
|
|
@@ -21437,7 +21513,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21437
21513
|
} catch(e) {
|
21438
21514
|
return makePromise(e, false);
|
21439
21515
|
}
|
21440
|
-
if (
|
21516
|
+
if (isPromiseLike(callbackOutput)) {
|
21441
21517
|
return callbackOutput.then(function() {
|
21442
21518
|
return makePromise(value, isResolved);
|
21443
21519
|
}, function(error) {
|
@@ -21462,7 +21538,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21462
21538
|
|
21463
21539
|
|
21464
21540
|
var ref = function(value) {
|
21465
|
-
if (
|
21541
|
+
if (isPromiseLike(value)) return value;
|
21466
21542
|
return {
|
21467
21543
|
then: function(callback) {
|
21468
21544
|
var result = defer();
|
@@ -21646,12 +21722,38 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21646
21722
|
return deferred.promise;
|
21647
21723
|
}
|
21648
21724
|
|
21649
|
-
|
21650
|
-
|
21651
|
-
|
21652
|
-
|
21653
|
-
|
21725
|
+
var $Q = function Q(resolver) {
|
21726
|
+
if (!isFunction(resolver)) {
|
21727
|
+
// TODO(@caitp): minErr this
|
21728
|
+
throw new TypeError('Expected resolverFn');
|
21729
|
+
}
|
21730
|
+
|
21731
|
+
if (!(this instanceof Q)) {
|
21732
|
+
// More useful when $Q is the Promise itself.
|
21733
|
+
return new Q(resolver);
|
21734
|
+
}
|
21735
|
+
|
21736
|
+
var deferred = defer();
|
21737
|
+
|
21738
|
+
function resolveFn(value) {
|
21739
|
+
deferred.resolve(value);
|
21740
|
+
}
|
21741
|
+
|
21742
|
+
function rejectFn(reason) {
|
21743
|
+
deferred.reject(reason);
|
21744
|
+
}
|
21745
|
+
|
21746
|
+
resolver(resolveFn, rejectFn);
|
21747
|
+
|
21748
|
+
return deferred.promise;
|
21654
21749
|
};
|
21750
|
+
|
21751
|
+
$Q.defer = defer;
|
21752
|
+
$Q.reject = reject;
|
21753
|
+
$Q.when = when;
|
21754
|
+
$Q.all = all;
|
21755
|
+
|
21756
|
+
return $Q;
|
21655
21757
|
}
|
21656
21758
|
|
21657
21759
|
function $$RAFProvider(){ //rAF
|
@@ -22001,20 +22103,25 @@ function $RootScopeProvider(){
|
|
22001
22103
|
*
|
22002
22104
|
* - `string`: Evaluated as {@link guide/expression expression}
|
22003
22105
|
* - `function(scope)`: called with current `scope` as a parameter.
|
22004
|
-
* @param {
|
22005
|
-
*
|
22006
|
-
*
|
22007
|
-
* - `string`: Evaluated as {@link guide/expression expression}
|
22008
|
-
* - `function(newValue, oldValue, scope)`: called with current and previous values as
|
22009
|
-
* parameters.
|
22106
|
+
* @param {function(newVal, oldVal, scope)} listener Callback called whenever the value
|
22107
|
+
* of `watchExpression` changes.
|
22010
22108
|
*
|
22109
|
+
* - `newVal` contains the current value of the `watchExpression`
|
22110
|
+
* - `oldVal` contains the previous value of the `watchExpression`
|
22111
|
+
* - `scope` refers to the current scope
|
22011
22112
|
* @param {boolean=} objectEquality Compare for object equality using {@link angular.equals} instead of
|
22012
22113
|
* comparing for reference equality.
|
22114
|
+
* @param {function()=} deregisterNotifier Function to call when the deregistration function
|
22115
|
+
* get called.
|
22013
22116
|
* @returns {function()} Returns a deregistration function for this listener.
|
22014
22117
|
*/
|
22015
|
-
$watch: function(watchExp, listener, objectEquality) {
|
22118
|
+
$watch: function(watchExp, listener, objectEquality, deregisterNotifier) {
|
22119
|
+
var get = compileToFn(watchExp, 'watch');
|
22120
|
+
|
22121
|
+
if (get.$$watchDelegate) {
|
22122
|
+
return get.$$watchDelegate(this, listener, objectEquality, deregisterNotifier, get);
|
22123
|
+
}
|
22016
22124
|
var scope = this,
|
22017
|
-
get = compileToFn(watchExp, 'watch'),
|
22018
22125
|
array = scope.$$watchers,
|
22019
22126
|
watcher = {
|
22020
22127
|
fn: listener,
|
@@ -22026,10 +22133,8 @@ function $RootScopeProvider(){
|
|
22026
22133
|
|
22027
22134
|
lastDirtyWatch = null;
|
22028
22135
|
|
22029
|
-
// in the case user pass string, we need to compile it, do we really need this ?
|
22030
22136
|
if (!isFunction(listener)) {
|
22031
|
-
|
22032
|
-
watcher.fn = function(newVal, oldVal, scope) {listenFn(scope);};
|
22137
|
+
watcher.fn = noop;
|
22033
22138
|
}
|
22034
22139
|
|
22035
22140
|
if (!array) {
|
@@ -22042,6 +22147,9 @@ function $RootScopeProvider(){
|
|
22042
22147
|
return function deregisterWatch() {
|
22043
22148
|
arrayRemove(array, watcher);
|
22044
22149
|
lastDirtyWatch = null;
|
22150
|
+
if (isFunction(deregisterNotifier)) {
|
22151
|
+
deregisterNotifier();
|
22152
|
+
}
|
22045
22153
|
};
|
22046
22154
|
},
|
22047
22155
|
|
@@ -22068,7 +22176,6 @@ function $RootScopeProvider(){
|
|
22068
22176
|
* and the `oldValues` array contains the previous values of the `watchExpressions`, with the indexes matching
|
22069
22177
|
* those of `watchExpression`
|
22070
22178
|
* The `scope` refers to the current scope.
|
22071
|
-
*
|
22072
22179
|
* @returns {function()} Returns a de-registration function for all listeners.
|
22073
22180
|
*/
|
22074
22181
|
$watchGroup: function(watchExpressions, listener) {
|
@@ -22077,37 +22184,43 @@ function $RootScopeProvider(){
|
|
22077
22184
|
var deregisterFns = [];
|
22078
22185
|
var changeCount = 0;
|
22079
22186
|
var self = this;
|
22080
|
-
var
|
22081
|
-
|
22187
|
+
var masterUnwatch;
|
22188
|
+
|
22189
|
+
if (watchExpressions.length === 1) {
|
22190
|
+
// Special case size of one
|
22191
|
+
return this.$watch(watchExpressions[0], function watchGroupAction(value, oldValue, scope) {
|
22192
|
+
newValues[0] = value;
|
22193
|
+
oldValues[0] = oldValue;
|
22194
|
+
listener.call(this, newValues, (value === oldValue) ? newValues : oldValues, scope);
|
22195
|
+
});
|
22196
|
+
}
|
22082
22197
|
|
22083
22198
|
forEach(watchExpressions, function (expr, i) {
|
22084
|
-
var
|
22085
|
-
deregisterFns.push(self.$watch(exprFn, function (value, oldValue) {
|
22199
|
+
var unwatch = self.$watch(expr, function watchGroupSubAction(value, oldValue) {
|
22086
22200
|
newValues[i] = value;
|
22087
22201
|
oldValues[i] = oldValue;
|
22088
22202
|
changeCount++;
|
22089
|
-
|
22090
|
-
|
22091
|
-
|
22092
|
-
|
22203
|
+
}, false, function watchGroupDeregNotifier() {
|
22204
|
+
arrayRemove(deregisterFns, unwatch);
|
22205
|
+
if (!deregisterFns.length) {
|
22206
|
+
masterUnwatch();
|
22207
|
+
}
|
22208
|
+
});
|
22209
|
+
|
22210
|
+
deregisterFns.push(unwatch);
|
22093
22211
|
}, this);
|
22094
22212
|
|
22095
|
-
|
22096
|
-
|
22097
|
-
|
22098
|
-
|
22099
|
-
|
22100
|
-
watchGroupFn.$$unwatch = false;
|
22101
|
-
}
|
22102
|
-
}));
|
22213
|
+
masterUnwatch = self.$watch(function watchGroupChangeWatch() {
|
22214
|
+
return changeCount;
|
22215
|
+
}, function watchGroupChangeAction(value, oldValue) {
|
22216
|
+
listener(newValues, (value === oldValue) ? newValues : oldValues, self);
|
22217
|
+
});
|
22103
22218
|
|
22104
22219
|
return function deregisterWatchGroup() {
|
22105
|
-
|
22106
|
-
|
22107
|
-
}
|
22220
|
+
while (deregisterFns.length) {
|
22221
|
+
deregisterFns[0]();
|
22222
|
+
}
|
22108
22223
|
};
|
22109
|
-
|
22110
|
-
function watchGroupFn() {return changeCount;}
|
22111
22224
|
},
|
22112
22225
|
|
22113
22226
|
|
@@ -22178,15 +22291,15 @@ function $RootScopeProvider(){
|
|
22178
22291
|
// only track veryOldValue if the listener is asking for it
|
22179
22292
|
var trackVeryOldValue = (listener.length > 1);
|
22180
22293
|
var changeDetected = 0;
|
22181
|
-
var
|
22294
|
+
var changeDetector = $parse(obj, $watchCollectionInterceptor);
|
22182
22295
|
var internalArray = [];
|
22183
22296
|
var internalObject = {};
|
22184
22297
|
var initRun = true;
|
22185
22298
|
var oldLength = 0;
|
22186
22299
|
|
22187
|
-
function $
|
22188
|
-
newValue =
|
22189
|
-
var newLength, key;
|
22300
|
+
function $watchCollectionInterceptor(_value) {
|
22301
|
+
newValue = _value;
|
22302
|
+
var newLength, key, bothNaN;
|
22190
22303
|
|
22191
22304
|
if (!isObject(newValue)) { // if primitive
|
22192
22305
|
if (oldValue !== newValue) {
|
@@ -22210,7 +22323,7 @@ function $RootScopeProvider(){
|
|
22210
22323
|
}
|
22211
22324
|
// copy the items to oldValue and look for changes.
|
22212
22325
|
for (var i = 0; i < newLength; i++) {
|
22213
|
-
|
22326
|
+
bothNaN = (oldValue[i] !== oldValue[i]) &&
|
22214
22327
|
(newValue[i] !== newValue[i]);
|
22215
22328
|
if (!bothNaN && (oldValue[i] !== newValue[i])) {
|
22216
22329
|
changeDetected++;
|
@@ -22230,7 +22343,9 @@ function $RootScopeProvider(){
|
|
22230
22343
|
if (newValue.hasOwnProperty(key)) {
|
22231
22344
|
newLength++;
|
22232
22345
|
if (oldValue.hasOwnProperty(key)) {
|
22233
|
-
|
22346
|
+
bothNaN = (oldValue[key] !== oldValue[key]) &&
|
22347
|
+
(newValue[key] !== newValue[key]);
|
22348
|
+
if (!bothNaN && (oldValue[key] !== newValue[key])) {
|
22234
22349
|
changeDetected++;
|
22235
22350
|
oldValue[key] = newValue[key];
|
22236
22351
|
}
|
@@ -22252,7 +22367,6 @@ function $RootScopeProvider(){
|
|
22252
22367
|
}
|
22253
22368
|
}
|
22254
22369
|
}
|
22255
|
-
$watchCollectionWatch.$$unwatch = objGetter.$$unwatch;
|
22256
22370
|
return changeDetected;
|
22257
22371
|
}
|
22258
22372
|
|
@@ -22285,7 +22399,7 @@ function $RootScopeProvider(){
|
|
22285
22399
|
}
|
22286
22400
|
}
|
22287
22401
|
|
22288
|
-
return this.$watch(
|
22402
|
+
return this.$watch(changeDetector, $watchCollectionAction);
|
22289
22403
|
},
|
22290
22404
|
|
22291
22405
|
/**
|
@@ -22348,7 +22462,6 @@ function $RootScopeProvider(){
|
|
22348
22462
|
dirty, ttl = TTL,
|
22349
22463
|
next, current, target = this,
|
22350
22464
|
watchLog = [],
|
22351
|
-
stableWatchesCandidates = [],
|
22352
22465
|
logIdx, logMsg, asyncTask;
|
22353
22466
|
|
22354
22467
|
beginPhase('$digest');
|
@@ -22399,7 +22512,6 @@ function $RootScopeProvider(){
|
|
22399
22512
|
logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
|
22400
22513
|
watchLog[logIdx].push(logMsg);
|
22401
22514
|
}
|
22402
|
-
if (watch.get.$$unwatch) stableWatchesCandidates.push({watch: watch, array: watchers});
|
22403
22515
|
} else if (watch === lastDirtyWatch) {
|
22404
22516
|
// If the most recently dirty watcher is now clean, short circuit since the remaining watchers
|
22405
22517
|
// have already been tested.
|
@@ -22446,13 +22558,6 @@ function $RootScopeProvider(){
|
|
22446
22558
|
$exceptionHandler(e);
|
22447
22559
|
}
|
22448
22560
|
}
|
22449
|
-
|
22450
|
-
for (length = stableWatchesCandidates.length - 1; length >= 0; --length) {
|
22451
|
-
var candidate = stableWatchesCandidates[length];
|
22452
|
-
if (candidate.watch.get.$$unwatch) {
|
22453
|
-
arrayRemove(candidate.array, candidate.watch);
|
22454
|
-
}
|
22455
|
-
}
|
22456
22561
|
},
|
22457
22562
|
|
22458
22563
|
|
@@ -23767,11 +23872,9 @@ function $SceProvider() {
|
|
23767
23872
|
if (parsed.literal && parsed.constant) {
|
23768
23873
|
return parsed;
|
23769
23874
|
} else {
|
23770
|
-
return function
|
23771
|
-
|
23772
|
-
|
23773
|
-
return result;
|
23774
|
-
};
|
23875
|
+
return $parse(expr, function (value) {
|
23876
|
+
return sce.getTrusted(type, value);
|
23877
|
+
});
|
23775
23878
|
}
|
23776
23879
|
};
|
23777
23880
|
|
@@ -25164,11 +25267,7 @@ function dateFilter($locale) {
|
|
25164
25267
|
format = format || 'mediumDate';
|
25165
25268
|
format = $locale.DATETIME_FORMATS[format] || format;
|
25166
25269
|
if (isString(date)) {
|
25167
|
-
|
25168
|
-
date = int(date);
|
25169
|
-
} else {
|
25170
|
-
date = jsonStringToDate(date);
|
25171
|
-
}
|
25270
|
+
date = NUMBER_STRING.test(date) ? int(date) : jsonStringToDate(date);
|
25172
25271
|
}
|
25173
25272
|
|
25174
25273
|
if (isNumber(date)) {
|
@@ -25443,7 +25542,7 @@ function limitToFilter(){
|
|
25443
25542
|
* @example
|
25444
25543
|
<example module="orderByExample">
|
25445
25544
|
<file name="index.html">
|
25446
|
-
<div ng-controller="
|
25545
|
+
<div ng-controller="ExampleController">
|
25447
25546
|
<table class="friend">
|
25448
25547
|
<tr>
|
25449
25548
|
<th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
|
@@ -25524,6 +25623,10 @@ function orderByFilter($parse){
|
|
25524
25623
|
var t1 = typeof v1;
|
25525
25624
|
var t2 = typeof v2;
|
25526
25625
|
if (t1 == t2) {
|
25626
|
+
if (isDate(v1) && isDate(v2)) {
|
25627
|
+
v1 = v1.valueOf();
|
25628
|
+
v2 = v2.valueOf();
|
25629
|
+
}
|
25527
25630
|
if (t1 == "string") {
|
25528
25631
|
v1 = v1.toLowerCase();
|
25529
25632
|
v2 = v2.toLowerCase();
|
@@ -25946,6 +26049,7 @@ forEach(BOOLEAN_ATTR, function(propName, attrName) {
|
|
25946
26049
|
var normalized = directiveNormalize('ng-' + attrName);
|
25947
26050
|
ngAttributeAliasDirectives[normalized] = function() {
|
25948
26051
|
return {
|
26052
|
+
restrict: 'A',
|
25949
26053
|
priority: 100,
|
25950
26054
|
link: function(scope, element, attr) {
|
25951
26055
|
scope.$watch(attr[normalized], function ngBooleanAttrWatchAction(value) {
|
@@ -25998,8 +26102,12 @@ forEach(['src', 'srcset', 'href'], function(attrName) {
|
|
25998
26102
|
}
|
25999
26103
|
|
26000
26104
|
attr.$observe(normalized, function(value) {
|
26001
|
-
if (!value)
|
26002
|
-
|
26105
|
+
if (!value) {
|
26106
|
+
if (attrName === 'href') {
|
26107
|
+
attr.$set(name, null);
|
26108
|
+
}
|
26109
|
+
return;
|
26110
|
+
}
|
26003
26111
|
|
26004
26112
|
attr.$set(name, value);
|
26005
26113
|
|
@@ -26587,7 +26695,9 @@ var inputType = {
|
|
26587
26695
|
* @description
|
26588
26696
|
* Input with date validation and transformation. In browsers that do not yet support
|
26589
26697
|
* the HTML5 date input, a text element will be used. In that case, text must be entered in a valid ISO-8601
|
26590
|
-
* date format (yyyy-MM-dd), for example: `2009-01-06`.
|
26698
|
+
* date format (yyyy-MM-dd), for example: `2009-01-06`. Since many
|
26699
|
+
* modern browsers do not yet support this input type, it is important to provide cues to users on the
|
26700
|
+
* expected input format via a placeholder or label. The model must always be a Date object.
|
26591
26701
|
*
|
26592
26702
|
* @param {string} ngModel Assignable angular expression to data-bind to.
|
26593
26703
|
* @param {string=} name Property name of the form under which the control is published.
|
@@ -28630,6 +28740,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
28630
28740
|
*/
|
28631
28741
|
var ngModelDirective = function() {
|
28632
28742
|
return {
|
28743
|
+
restrict: 'A',
|
28633
28744
|
require: ['ngModel', '^?form', '^?ngModelOptions'],
|
28634
28745
|
controller: NgModelController,
|
28635
28746
|
link: {
|
@@ -28731,6 +28842,7 @@ var ngModelDirective = function() {
|
|
28731
28842
|
* </example>
|
28732
28843
|
*/
|
28733
28844
|
var ngChangeDirective = valueFn({
|
28845
|
+
restrict: 'A',
|
28734
28846
|
require: 'ngModel',
|
28735
28847
|
link: function(scope, element, attr, ctrl) {
|
28736
28848
|
ctrl.$viewChangeListeners.push(function() {
|
@@ -28742,6 +28854,7 @@ var ngChangeDirective = valueFn({
|
|
28742
28854
|
|
28743
28855
|
var requiredDirective = function() {
|
28744
28856
|
return {
|
28857
|
+
restrict: 'A',
|
28745
28858
|
require: '?ngModel',
|
28746
28859
|
link: function(scope, elm, attr, ctrl) {
|
28747
28860
|
if (!ctrl) return;
|
@@ -28761,6 +28874,7 @@ var requiredDirective = function() {
|
|
28761
28874
|
|
28762
28875
|
var patternDirective = function() {
|
28763
28876
|
return {
|
28877
|
+
restrict: 'A',
|
28764
28878
|
require: '?ngModel',
|
28765
28879
|
link: function(scope, elm, attr, ctrl) {
|
28766
28880
|
if (!ctrl) return;
|
@@ -28791,6 +28905,7 @@ var patternDirective = function() {
|
|
28791
28905
|
|
28792
28906
|
var maxlengthDirective = function() {
|
28793
28907
|
return {
|
28908
|
+
restrict: 'A',
|
28794
28909
|
require: '?ngModel',
|
28795
28910
|
link: function(scope, elm, attr, ctrl) {
|
28796
28911
|
if (!ctrl) return;
|
@@ -28809,6 +28924,7 @@ var maxlengthDirective = function() {
|
|
28809
28924
|
|
28810
28925
|
var minlengthDirective = function() {
|
28811
28926
|
return {
|
28927
|
+
restrict: 'A',
|
28812
28928
|
require: '?ngModel',
|
28813
28929
|
link: function(scope, elm, attr, ctrl) {
|
28814
28930
|
if (!ctrl) return;
|
@@ -28831,62 +28947,93 @@ var minlengthDirective = function() {
|
|
28831
28947
|
* @name ngList
|
28832
28948
|
*
|
28833
28949
|
* @description
|
28834
|
-
* Text input that converts between a delimited string and an array of strings. The
|
28835
|
-
*
|
28950
|
+
* Text input that converts between a delimited string and an array of strings. The default
|
28951
|
+
* delimiter is a comma followed by a space - equivalent to `ng-list=", "`. You can specify a custom
|
28952
|
+
* delimiter as the value of the `ngList` attribute - for example, `ng-list=" | "`.
|
28953
|
+
*
|
28954
|
+
* The behaviour of the directive is affected by the use of the `ngTrim` attribute.
|
28955
|
+
* * If `ngTrim` is set to `"false"` then whitespace around both the separator and each
|
28956
|
+
* list item is respected. This implies that the user of the directive is responsible for
|
28957
|
+
* dealing with whitespace but also allows you to use whitespace as a delimiter, such as a
|
28958
|
+
* tab or newline character.
|
28959
|
+
* * Otherwise whitespace around the delimiter is ignored when splitting (although it is respected
|
28960
|
+
* when joining the list items back together) and whitespace around each list item is stripped
|
28961
|
+
* before it is added to the model.
|
28962
|
+
*
|
28963
|
+
* ### Example with Validation
|
28964
|
+
*
|
28965
|
+
* <example name="ngList-directive" module="listExample">
|
28966
|
+
* <file name="app.js">
|
28967
|
+
* angular.module('listExample', [])
|
28968
|
+
* .controller('ExampleController', ['$scope', function($scope) {
|
28969
|
+
* $scope.names = ['morpheus', 'neo', 'trinity'];
|
28970
|
+
* }]);
|
28971
|
+
* </file>
|
28972
|
+
* <file name="index.html">
|
28973
|
+
* <form name="myForm" ng-controller="ExampleController">
|
28974
|
+
* List: <input name="namesInput" ng-model="names" ng-list required>
|
28975
|
+
* <span class="error" ng-show="myForm.namesInput.$error.required">
|
28976
|
+
* Required!</span>
|
28977
|
+
* <br>
|
28978
|
+
* <tt>names = {{names}}</tt><br/>
|
28979
|
+
* <tt>myForm.namesInput.$valid = {{myForm.namesInput.$valid}}</tt><br/>
|
28980
|
+
* <tt>myForm.namesInput.$error = {{myForm.namesInput.$error}}</tt><br/>
|
28981
|
+
* <tt>myForm.$valid = {{myForm.$valid}}</tt><br/>
|
28982
|
+
* <tt>myForm.$error.required = {{!!myForm.$error.required}}</tt><br/>
|
28983
|
+
* </form>
|
28984
|
+
* </file>
|
28985
|
+
* <file name="protractor.js" type="protractor">
|
28986
|
+
* var listInput = element(by.model('names'));
|
28987
|
+
* var names = element(by.binding('{{names}}'));
|
28988
|
+
* var valid = element(by.binding('myForm.namesInput.$valid'));
|
28989
|
+
* var error = element(by.css('span.error'));
|
28990
|
+
*
|
28991
|
+
* it('should initialize to model', function() {
|
28992
|
+
* expect(names.getText()).toContain('["morpheus","neo","trinity"]');
|
28993
|
+
* expect(valid.getText()).toContain('true');
|
28994
|
+
* expect(error.getCssValue('display')).toBe('none');
|
28995
|
+
* });
|
28836
28996
|
*
|
28837
|
-
*
|
28838
|
-
*
|
28839
|
-
*
|
28997
|
+
* it('should be invalid if empty', function() {
|
28998
|
+
* listInput.clear();
|
28999
|
+
* listInput.sendKeys('');
|
28840
29000
|
*
|
28841
|
-
*
|
28842
|
-
|
28843
|
-
|
28844
|
-
|
28845
|
-
|
28846
|
-
|
28847
|
-
|
28848
|
-
|
28849
|
-
|
28850
|
-
|
28851
|
-
|
28852
|
-
|
28853
|
-
|
28854
|
-
|
28855
|
-
|
28856
|
-
|
28857
|
-
|
28858
|
-
|
28859
|
-
|
28860
|
-
|
28861
|
-
|
28862
|
-
|
28863
|
-
|
28864
|
-
|
28865
|
-
|
28866
|
-
var error = element(by.css('span.error'));
|
28867
|
-
|
28868
|
-
it('should initialize to model', function() {
|
28869
|
-
expect(names.getText()).toContain('["igor","misko","vojta"]');
|
28870
|
-
expect(valid.getText()).toContain('true');
|
28871
|
-
expect(error.getCssValue('display')).toBe('none');
|
28872
|
-
});
|
28873
|
-
|
28874
|
-
it('should be invalid if empty', function() {
|
28875
|
-
listInput.clear();
|
28876
|
-
listInput.sendKeys('');
|
28877
|
-
|
28878
|
-
expect(names.getText()).toContain('');
|
28879
|
-
expect(valid.getText()).toContain('false');
|
28880
|
-
expect(error.getCssValue('display')).not.toBe('none'); });
|
28881
|
-
</file>
|
28882
|
-
</example>
|
29001
|
+
* expect(names.getText()).toContain('');
|
29002
|
+
* expect(valid.getText()).toContain('false');
|
29003
|
+
* expect(error.getCssValue('display')).not.toBe('none');
|
29004
|
+
* });
|
29005
|
+
* </file>
|
29006
|
+
* </example>
|
29007
|
+
*
|
29008
|
+
* ### Example - splitting on whitespace
|
29009
|
+
* <example name="ngList-directive-newlines">
|
29010
|
+
* <file name="index.html">
|
29011
|
+
* <textarea ng-model="list" ng-list=" " ng-trim="false"></textarea>
|
29012
|
+
* <pre>{{ list | json }}</pre>
|
29013
|
+
* </file>
|
29014
|
+
* <file name="protractor.js" type="protractor">
|
29015
|
+
* it("should split the text by newlines", function() {
|
29016
|
+
* var listInput = element(by.model('list'));
|
29017
|
+
* var output = element(by.binding('{{ list | json }}'));
|
29018
|
+
* listInput.sendKeys('abc\ndef\nghi');
|
29019
|
+
* expect(output.getText()).toContain('[\n "abc",\n "def",\n "ghi"\n]');
|
29020
|
+
* });
|
29021
|
+
* </file>
|
29022
|
+
* </example>
|
29023
|
+
*
|
29024
|
+
* @element input
|
29025
|
+
* @param {string=} ngList optional delimiter that should be used to split the value.
|
28883
29026
|
*/
|
28884
29027
|
var ngListDirective = function() {
|
28885
29028
|
return {
|
29029
|
+
restrict: 'A',
|
28886
29030
|
require: 'ngModel',
|
28887
29031
|
link: function(scope, element, attr, ctrl) {
|
28888
|
-
|
28889
|
-
|
29032
|
+
// We want to control whitespace trimming so we use this convoluted approach
|
29033
|
+
// to access the ngList attribute, which doesn't pre-trim the attribute
|
29034
|
+
var ngList = element.attr(attr.$attr.ngList) || ', ';
|
29035
|
+
var trimValues = attr.ngTrim !== 'false';
|
29036
|
+
var separator = trimValues ? trim(ngList) : ngList;
|
28890
29037
|
|
28891
29038
|
var parse = function(viewValue) {
|
28892
29039
|
// If the viewValue is invalid (say required but empty) it will be `undefined`
|
@@ -28896,7 +29043,7 @@ var ngListDirective = function() {
|
|
28896
29043
|
|
28897
29044
|
if (viewValue) {
|
28898
29045
|
forEach(viewValue.split(separator), function(value) {
|
28899
|
-
if (value) list.push(trim(value));
|
29046
|
+
if (value) list.push(trimValues ? trim(value) : value);
|
28900
29047
|
});
|
28901
29048
|
}
|
28902
29049
|
|
@@ -28906,7 +29053,7 @@ var ngListDirective = function() {
|
|
28906
29053
|
ctrl.$parsers.push(parse);
|
28907
29054
|
ctrl.$formatters.push(function(value) {
|
28908
29055
|
if (isArray(value)) {
|
28909
|
-
return value.join(
|
29056
|
+
return value.join(ngList);
|
28910
29057
|
}
|
28911
29058
|
|
28912
29059
|
return undefined;
|
@@ -28976,6 +29123,7 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
|
|
28976
29123
|
*/
|
28977
29124
|
var ngValueDirective = function() {
|
28978
29125
|
return {
|
29126
|
+
restrict: 'A',
|
28979
29127
|
priority: 100,
|
28980
29128
|
compile: function(tpl, tplAttr) {
|
28981
29129
|
if (CONSTANT_VALUE_REGEXP.test(tplAttr.ngValue)) {
|
@@ -29138,6 +29286,7 @@ var ngValueDirective = function() {
|
|
29138
29286
|
*/
|
29139
29287
|
var ngModelOptionsDirective = function() {
|
29140
29288
|
return {
|
29289
|
+
restrict: 'A',
|
29141
29290
|
controller: ['$scope', '$attrs', function($scope, $attrs) {
|
29142
29291
|
var that = this;
|
29143
29292
|
this.$options = $scope.$eval($attrs.ngModelOptions);
|
@@ -29169,7 +29318,7 @@ var ngModelOptionsDirective = function() {
|
|
29169
29318
|
* Typically, you don't use `ngBind` directly, but instead you use the double curly markup like
|
29170
29319
|
* `{{ expression }}` which is similar but less verbose.
|
29171
29320
|
*
|
29172
|
-
* It is preferable to use `ngBind` instead of `{{ expression }}`
|
29321
|
+
* It is preferable to use `ngBind` instead of `{{ expression }}` if a template is momentarily
|
29173
29322
|
* displayed by the browser in its raw state before Angular compiles it. Since `ngBind` is an
|
29174
29323
|
* element attribute, it makes the bindings invisible to the user while the page is loading.
|
29175
29324
|
*
|
@@ -29333,19 +29482,25 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
|
|
29333
29482
|
</example>
|
29334
29483
|
*/
|
29335
29484
|
var ngBindHtmlDirective = ['$sce', '$parse', function($sce, $parse) {
|
29336
|
-
return
|
29337
|
-
|
29485
|
+
return {
|
29486
|
+
restrict: 'A',
|
29487
|
+
compile: function (tElement, tAttrs) {
|
29488
|
+
tElement.addClass('ng-binding');
|
29338
29489
|
|
29339
|
-
|
29340
|
-
|
29341
|
-
|
29342
|
-
|
29343
|
-
|
29344
|
-
|
29490
|
+
return function (scope, element, attr) {
|
29491
|
+
element.data('$binding', attr.ngBindHtml);
|
29492
|
+
var parsed = $parse(attr.ngBindHtml);
|
29493
|
+
var changeDetector = $parse(attr.ngBindHtml, function getStringValue(value) {
|
29494
|
+
return (value || '').toString();
|
29495
|
+
});
|
29345
29496
|
|
29346
|
-
|
29347
|
-
|
29348
|
-
|
29497
|
+
scope.$watch(changeDetector, function ngBindHtmlWatchAction() {
|
29498
|
+
// we re-evaluate the expr because we want a TrustedValueHolderType
|
29499
|
+
// for $sce, not a string
|
29500
|
+
element.html($sce.getTrustedHtml(parsed(scope)) || '');
|
29501
|
+
});
|
29502
|
+
};
|
29503
|
+
}
|
29349
29504
|
};
|
29350
29505
|
}];
|
29351
29506
|
|
@@ -29991,6 +30146,7 @@ var ngCloakDirective = ngDirective({
|
|
29991
30146
|
*/
|
29992
30147
|
var ngControllerDirective = [function() {
|
29993
30148
|
return {
|
30149
|
+
restrict: 'A',
|
29994
30150
|
scope: true,
|
29995
30151
|
controller: '@',
|
29996
30152
|
priority: 500
|
@@ -30008,8 +30164,10 @@ var ngControllerDirective = [function() {
|
|
30008
30164
|
* This is necessary when developing things like Google Chrome Extensions.
|
30009
30165
|
*
|
30010
30166
|
* CSP forbids apps to use `eval` or `Function(string)` generated functions (among other things).
|
30011
|
-
* For
|
30012
|
-
*
|
30167
|
+
* For Angular to be CSP compatible there are only two things that we need to do differently:
|
30168
|
+
*
|
30169
|
+
* - don't use `Function` constructor to generate optimized value getters
|
30170
|
+
* - don't inject custom stylesheet into the document
|
30013
30171
|
*
|
30014
30172
|
* AngularJS uses `Function(string)` generated functions as a speed optimization. Applying the `ngCsp`
|
30015
30173
|
* directive will cause Angular to use CSP compatibility mode. When this mode is on AngularJS will
|
@@ -30020,7 +30178,18 @@ var ngControllerDirective = [function() {
|
|
30020
30178
|
* includes some CSS rules (e.g. {@link ng.directive:ngCloak ngCloak}).
|
30021
30179
|
* To make those directives work in CSP mode, include the `angular-csp.css` manually.
|
30022
30180
|
*
|
30023
|
-
*
|
30181
|
+
* Angular tries to autodetect if CSP is active and automatically turn on the CSP-safe mode. This
|
30182
|
+
* autodetection however triggers a CSP error to be logged in the console:
|
30183
|
+
*
|
30184
|
+
* ```
|
30185
|
+
* Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of
|
30186
|
+
* script in the following Content Security Policy directive: "default-src 'self'". Note that
|
30187
|
+
* 'script-src' was not explicitly set, so 'default-src' is used as a fallback.
|
30188
|
+
* ```
|
30189
|
+
*
|
30190
|
+
* This error is harmless but annoying. To prevent the error from showing up, put the `ngCsp`
|
30191
|
+
* directive on the root element of the application or on the `angular.js` script tag, whichever
|
30192
|
+
* appears first in the html document.
|
30024
30193
|
*
|
30025
30194
|
* *Note: This directive is only available in the `ng-csp` and `data-ng-csp` attribute form.*
|
30026
30195
|
*
|
@@ -30035,9 +30204,9 @@ var ngControllerDirective = [function() {
|
|
30035
30204
|
```
|
30036
30205
|
*/
|
30037
30206
|
|
30038
|
-
// ngCsp is not implemented as a proper directive any more, because we need it be processed while we
|
30039
|
-
// the system (before $parse is instantiated), for this reason we just have
|
30040
|
-
// anywhere in the current doc
|
30207
|
+
// ngCsp is not implemented as a proper directive any more, because we need it be processed while we
|
30208
|
+
// bootstrap the system (before $parse is instantiated), for this reason we just have
|
30209
|
+
// the csp.isActive() fn that looks for ng-csp attribute anywhere in the current doc
|
30041
30210
|
|
30042
30211
|
/**
|
30043
30212
|
* @ngdoc directive
|
@@ -30082,6 +30251,7 @@ forEach(
|
|
30082
30251
|
var directiveName = directiveNormalize('ng-' + name);
|
30083
30252
|
ngEventDirectives[directiveName] = ['$parse', function($parse) {
|
30084
30253
|
return {
|
30254
|
+
restrict: 'A',
|
30085
30255
|
compile: function($element, attr) {
|
30086
30256
|
var fn = $parse(attr[directiveName]);
|
30087
30257
|
return function ngEventHandler(scope, element) {
|
@@ -30564,6 +30734,7 @@ forEach(
|
|
30564
30734
|
*/
|
30565
30735
|
var ngIfDirective = ['$animate', function($animate) {
|
30566
30736
|
return {
|
30737
|
+
multiElement: true,
|
30567
30738
|
transclude: 'element',
|
30568
30739
|
priority: 600,
|
30569
30740
|
terminal: true,
|
@@ -31297,6 +31468,13 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
31297
31468
|
* For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
|
31298
31469
|
* will be associated by item identity in the array.
|
31299
31470
|
*
|
31471
|
+
* * `variable in expression as alias_expression` – You can also provide an optional alias expression which will then store the
|
31472
|
+
* intermediate results of the repeater after the filters have been applied. Typically this is used to render a special message
|
31473
|
+
* when a filter is active on the repeater, but the filtered result set is empty.
|
31474
|
+
*
|
31475
|
+
* For example: `item in items | filter:x as results` will store the fragment of the repeated items as `results`, but only after
|
31476
|
+
* the items have been processed through the filter.
|
31477
|
+
*
|
31300
31478
|
* For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
|
31301
31479
|
* `$$hashKey` property to each item in the array. This property is then used as a key to associated DOM elements
|
31302
31480
|
* with the corresponding item in the array by identity. Moving the same object in array would move the DOM
|
@@ -31329,9 +31507,12 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
31329
31507
|
I have {{friends.length}} friends. They are:
|
31330
31508
|
<input type="search" ng-model="q" placeholder="filter friends..." />
|
31331
31509
|
<ul class="example-animate-container">
|
31332
|
-
<li class="animate-repeat" ng-repeat="friend in friends | filter:q">
|
31510
|
+
<li class="animate-repeat" ng-repeat="friend in friends | filter:q as results">
|
31333
31511
|
[{{$index + 1}}] {{friend.name}} who is {{friend.age}} years old.
|
31334
31512
|
</li>
|
31513
|
+
<li class="animate-repeat" ng-if="results.length == 0">
|
31514
|
+
<strong>No results found...</strong>
|
31515
|
+
</li>
|
31335
31516
|
</ul>
|
31336
31517
|
</div>
|
31337
31518
|
</file>
|
@@ -31399,14 +31580,16 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
31399
31580
|
var NG_REMOVED = '$$NG_REMOVED';
|
31400
31581
|
var ngRepeatMinErr = minErr('ngRepeat');
|
31401
31582
|
return {
|
31583
|
+
restrict: 'A',
|
31584
|
+
multiElement: true,
|
31402
31585
|
transclude: 'element',
|
31403
31586
|
priority: 1000,
|
31404
31587
|
terminal: true,
|
31405
31588
|
$$tlb: true,
|
31406
31589
|
link: function($scope, $element, $attr, ctrl, $transclude){
|
31407
31590
|
var expression = $attr.ngRepeat;
|
31408
|
-
var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),
|
31409
|
-
trackByExp, trackByExpGetter, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,
|
31591
|
+
var match = expression.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/),
|
31592
|
+
trackByExp, trackByExpGetter, aliasAs, trackByIdExpFn, trackByIdArrayFn, trackByIdObjFn,
|
31410
31593
|
lhs, rhs, valueIdentifier, keyIdentifier,
|
31411
31594
|
hashFnLocals = {$id: hashKey};
|
31412
31595
|
|
@@ -31417,7 +31600,8 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
31417
31600
|
|
31418
31601
|
lhs = match[1];
|
31419
31602
|
rhs = match[2];
|
31420
|
-
|
31603
|
+
aliasAs = match[3];
|
31604
|
+
trackByExp = match[4];
|
31421
31605
|
|
31422
31606
|
if (trackByExp) {
|
31423
31607
|
trackByExpGetter = $parse(trackByExp);
|
@@ -31469,6 +31653,10 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
31469
31653
|
nextBlockOrder = [],
|
31470
31654
|
elementsToRemove;
|
31471
31655
|
|
31656
|
+
if (aliasAs) {
|
31657
|
+
$scope[aliasAs] = collection;
|
31658
|
+
}
|
31659
|
+
|
31472
31660
|
var updateScope = function(scope, index) {
|
31473
31661
|
scope[valueIdentifier] = value;
|
31474
31662
|
if (keyIdentifier) scope[keyIdentifier] = key;
|
@@ -31744,10 +31932,14 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
31744
31932
|
</example>
|
31745
31933
|
*/
|
31746
31934
|
var ngShowDirective = ['$animate', function($animate) {
|
31747
|
-
return
|
31748
|
-
|
31749
|
-
|
31750
|
-
|
31935
|
+
return {
|
31936
|
+
restrict: 'A',
|
31937
|
+
multiElement: true,
|
31938
|
+
link: function(scope, element, attr) {
|
31939
|
+
scope.$watch(attr.ngShow, function ngShowWatchAction(value){
|
31940
|
+
$animate[value ? 'removeClass' : 'addClass'](element, 'ng-hide');
|
31941
|
+
});
|
31942
|
+
}
|
31751
31943
|
};
|
31752
31944
|
}];
|
31753
31945
|
|
@@ -31895,10 +32087,14 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
31895
32087
|
</example>
|
31896
32088
|
*/
|
31897
32089
|
var ngHideDirective = ['$animate', function($animate) {
|
31898
|
-
return
|
31899
|
-
|
31900
|
-
|
31901
|
-
|
32090
|
+
return {
|
32091
|
+
restrict: 'A',
|
32092
|
+
multiElement: true,
|
32093
|
+
link: function(scope, element, attr) {
|
32094
|
+
scope.$watch(attr.ngHide, function ngHideWatchAction(value){
|
32095
|
+
$animate[value ? 'addClass' : 'removeClass'](element, 'ng-hide');
|
32096
|
+
});
|
32097
|
+
}
|
31902
32098
|
};
|
31903
32099
|
}];
|
31904
32100
|
|
@@ -32109,7 +32305,7 @@ var ngSwitchDirective = ['$animate', function($animate) {
|
|
32109
32305
|
previousElements.length = 0;
|
32110
32306
|
|
32111
32307
|
for (i = 0, ii = selectedScopes.length; i < ii; ++i) {
|
32112
|
-
var selected = selectedElements[i];
|
32308
|
+
var selected = getBlockElements(selectedElements[i].clone);
|
32113
32309
|
selectedScopes[i].$destroy();
|
32114
32310
|
previousElements[i] = selected;
|
32115
32311
|
$animate.leave(selected, function() {
|
@@ -32123,12 +32319,13 @@ var ngSwitchDirective = ['$animate', function($animate) {
|
|
32123
32319
|
if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {
|
32124
32320
|
scope.$eval(attr.change);
|
32125
32321
|
forEach(selectedTranscludes, function(selectedTransclude) {
|
32126
|
-
|
32127
|
-
|
32128
|
-
selectedTransclude.transclude(selectedScope, function(caseElement) {
|
32322
|
+
selectedTransclude.transclude(function(caseElement, selectedScope) {
|
32323
|
+
selectedScopes.push(selectedScope);
|
32129
32324
|
var anchor = selectedTransclude.element;
|
32325
|
+
caseElement[caseElement.length++] = document.createComment(' end ngSwitchWhen: ');
|
32326
|
+
var block = { clone: caseElement };
|
32130
32327
|
|
32131
|
-
selectedElements.push(
|
32328
|
+
selectedElements.push(block);
|
32132
32329
|
$animate.enter(caseElement, anchor.parent(), anchor);
|
32133
32330
|
});
|
32134
32331
|
});
|
@@ -32140,8 +32337,9 @@ var ngSwitchDirective = ['$animate', function($animate) {
|
|
32140
32337
|
|
32141
32338
|
var ngSwitchWhenDirective = ngDirective({
|
32142
32339
|
transclude: 'element',
|
32143
|
-
priority:
|
32340
|
+
priority: 1200,
|
32144
32341
|
require: '^ngSwitch',
|
32342
|
+
multiElement: true,
|
32145
32343
|
link: function(scope, element, attrs, ctrl, $transclude) {
|
32146
32344
|
ctrl.cases['!' + attrs.ngSwitchWhen] = (ctrl.cases['!' + attrs.ngSwitchWhen] || []);
|
32147
32345
|
ctrl.cases['!' + attrs.ngSwitchWhen].push({ transclude: $transclude, element: element });
|
@@ -32150,8 +32348,9 @@ var ngSwitchWhenDirective = ngDirective({
|
|
32150
32348
|
|
32151
32349
|
var ngSwitchDefaultDirective = ngDirective({
|
32152
32350
|
transclude: 'element',
|
32153
|
-
priority:
|
32351
|
+
priority: 1200,
|
32154
32352
|
require: '^ngSwitch',
|
32353
|
+
multiElement: true,
|
32155
32354
|
link: function(scope, element, attr, ctrl, $transclude) {
|
32156
32355
|
ctrl.cases['?'] = (ctrl.cases['?'] || []);
|
32157
32356
|
ctrl.cases['?'].push({ transclude: $transclude, element: element });
|
@@ -32161,7 +32360,7 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
32161
32360
|
/**
|
32162
32361
|
* @ngdoc directive
|
32163
32362
|
* @name ngTransclude
|
32164
|
-
* @restrict
|
32363
|
+
* @restrict EAC
|
32165
32364
|
*
|
32166
32365
|
* @description
|
32167
32366
|
* Directive that marks the insertion point for the transcluded DOM of the nearest parent directive that uses transclusion.
|
@@ -32182,7 +32381,7 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
32182
32381
|
scope: { title:'@' },
|
32183
32382
|
template: '<div style="border: 1px solid black;">' +
|
32184
32383
|
'<div style="background-color: gray">{{title}}</div>' +
|
32185
|
-
'<
|
32384
|
+
'<ng-transclude></ng-transclude>' +
|
32186
32385
|
'</div>'
|
32187
32386
|
};
|
32188
32387
|
})
|
@@ -32213,6 +32412,7 @@ var ngSwitchDefaultDirective = ngDirective({
|
|
32213
32412
|
*
|
32214
32413
|
*/
|
32215
32414
|
var ngTranscludeDirective = ngDirective({
|
32415
|
+
restrict: 'EAC',
|
32216
32416
|
link: function($scope, $element, $attrs, controller, $transclude) {
|
32217
32417
|
if (!$transclude) {
|
32218
32418
|
throw minErr('ngTransclude')('orphan',
|
@@ -32413,7 +32613,11 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
32413
32613
|
</example>
|
32414
32614
|
*/
|
32415
32615
|
|
32416
|
-
var ngOptionsDirective = valueFn({
|
32616
|
+
var ngOptionsDirective = valueFn({
|
32617
|
+
restrict: 'A',
|
32618
|
+
terminal: true
|
32619
|
+
});
|
32620
|
+
|
32417
32621
|
// jshint maxlen: false
|
32418
32622
|
var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
32419
32623
|
//000011111111110000000000022222222220000000000000000000003333333333000000000000004444444444444440000000005555555555555550000000666666666666666000000000000000777777777700000000000000000008888888888
|
@@ -32824,6 +33028,12 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
32824
33028
|
// lastElement.prop('selected') provided by jQuery has side-effects
|
32825
33029
|
if (existingOption.selected !== option.selected) {
|
32826
33030
|
lastElement.prop('selected', (existingOption.selected = option.selected));
|
33031
|
+
if (msie) {
|
33032
|
+
// See #7692
|
33033
|
+
// The selected item wouldn't visually update on IE without this.
|
33034
|
+
// Tested on Win7: IE9, IE10 and IE11. Future IEs should be tested as well
|
33035
|
+
lastElement.prop('selected', existingOption.selected);
|
33036
|
+
}
|
32827
33037
|
}
|
32828
33038
|
} else {
|
32829
33039
|
// grow elements
|