angularjs-rails 1.2.16 → 1.2.18
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 +25 -8
- data/vendor/assets/javascripts/angular-cookies.js +21 -13
- data/vendor/assets/javascripts/angular-loader.js +8 -6
- data/vendor/assets/javascripts/angular-mocks.js +8 -6
- data/vendor/assets/javascripts/angular-resource.js +19 -10
- data/vendor/assets/javascripts/angular-route.js +3 -3
- data/vendor/assets/javascripts/angular-sanitize.js +9 -3
- data/vendor/assets/javascripts/angular-scenario.js +874 -620
- data/vendor/assets/javascripts/angular-touch.js +17 -8
- data/vendor/assets/javascripts/angular.js +870 -616
- data/vendor/assets/javascripts/unstable/angular-animate.js +28 -9
- data/vendor/assets/javascripts/unstable/angular-cookies.js +21 -13
- data/vendor/assets/javascripts/unstable/angular-loader.js +13 -6
- data/vendor/assets/javascripts/unstable/angular-messages.js +400 -0
- data/vendor/assets/javascripts/unstable/angular-mocks.js +51 -18
- data/vendor/assets/javascripts/unstable/angular-resource.js +286 -236
- data/vendor/assets/javascripts/unstable/angular-route.js +4 -5
- data/vendor/assets/javascripts/unstable/angular-sanitize.js +9 -3
- data/vendor/assets/javascripts/unstable/angular-scenario.js +2159 -1346
- data/vendor/assets/javascripts/unstable/angular-touch.js +65 -18
- data/vendor/assets/javascripts/unstable/angular.js +2138 -1322
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 675564da011e5c4251d43ebea6633404e83678eb
|
4
|
+
data.tar.gz: 953fcb7ebf68a070bbb4774b80f13fc2e46965d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 784a867e11120831117cd13ad1e3acd7139898df31b23876ee9252e4c8ff258120c67e48b598e41244307c289006b84765dc4fadb9e943d04ea810edde631762
|
7
|
+
data.tar.gz: 9c67f83ad585c191fd331fb1f0a7b1f2c39cbb6db7e8e9ce4367b85eb45653a14fffce211c1f503a4fe7e9e3895f5f713655d2ffab9456bc28a55af88f150c1d
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -295,6 +295,10 @@ angular.module('ngAnimate', ['ng'])
|
|
295
295
|
}
|
296
296
|
}
|
297
297
|
|
298
|
+
function prepareElement(element) {
|
299
|
+
return element && angular.element(element);
|
300
|
+
}
|
301
|
+
|
298
302
|
function stripCommentsFromElement(element) {
|
299
303
|
return angular.element(extractElementNode(element));
|
300
304
|
}
|
@@ -503,7 +507,7 @@ angular.module('ngAnimate', ['ng'])
|
|
503
507
|
/**
|
504
508
|
* @ngdoc service
|
505
509
|
* @name $animate
|
506
|
-
* @function
|
510
|
+
* @kind function
|
507
511
|
*
|
508
512
|
* @description
|
509
513
|
* The `$animate` service provides animation detection support while performing DOM operations (enter, leave and move) as well as during addClass and removeClass operations.
|
@@ -523,7 +527,7 @@ angular.module('ngAnimate', ['ng'])
|
|
523
527
|
/**
|
524
528
|
* @ngdoc method
|
525
529
|
* @name $animate#enter
|
526
|
-
* @function
|
530
|
+
* @kind function
|
527
531
|
*
|
528
532
|
* @description
|
529
533
|
* Appends the element to the parentElement element that resides in the document and then runs the enter animation. Once
|
@@ -550,6 +554,10 @@ angular.module('ngAnimate', ['ng'])
|
|
550
554
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
551
555
|
*/
|
552
556
|
enter : function(element, parentElement, afterElement, doneCallback) {
|
557
|
+
element = angular.element(element);
|
558
|
+
parentElement = prepareElement(parentElement);
|
559
|
+
afterElement = prepareElement(afterElement);
|
560
|
+
|
553
561
|
this.enabled(false, element);
|
554
562
|
$delegate.enter(element, parentElement, afterElement);
|
555
563
|
$rootScope.$$postDigest(function() {
|
@@ -561,7 +569,7 @@ angular.module('ngAnimate', ['ng'])
|
|
561
569
|
/**
|
562
570
|
* @ngdoc method
|
563
571
|
* @name $animate#leave
|
564
|
-
* @function
|
572
|
+
* @kind function
|
565
573
|
*
|
566
574
|
* @description
|
567
575
|
* Runs the leave animation operation and, upon completion, removes the element from the DOM. Once
|
@@ -586,6 +594,7 @@ angular.module('ngAnimate', ['ng'])
|
|
586
594
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
587
595
|
*/
|
588
596
|
leave : function(element, doneCallback) {
|
597
|
+
element = angular.element(element);
|
589
598
|
cancelChildAnimations(element);
|
590
599
|
this.enabled(false, element);
|
591
600
|
$rootScope.$$postDigest(function() {
|
@@ -598,7 +607,7 @@ angular.module('ngAnimate', ['ng'])
|
|
598
607
|
/**
|
599
608
|
* @ngdoc method
|
600
609
|
* @name $animate#move
|
601
|
-
* @function
|
610
|
+
* @kind function
|
602
611
|
*
|
603
612
|
* @description
|
604
613
|
* Fires the move DOM operation. Just before the animation starts, the animate service will either append it into the parentElement container or
|
@@ -626,6 +635,10 @@ angular.module('ngAnimate', ['ng'])
|
|
626
635
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
627
636
|
*/
|
628
637
|
move : function(element, parentElement, afterElement, doneCallback) {
|
638
|
+
element = angular.element(element);
|
639
|
+
parentElement = prepareElement(parentElement);
|
640
|
+
afterElement = prepareElement(afterElement);
|
641
|
+
|
629
642
|
cancelChildAnimations(element);
|
630
643
|
this.enabled(false, element);
|
631
644
|
$delegate.move(element, parentElement, afterElement);
|
@@ -665,6 +678,7 @@ angular.module('ngAnimate', ['ng'])
|
|
665
678
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
666
679
|
*/
|
667
680
|
addClass : function(element, className, doneCallback) {
|
681
|
+
element = angular.element(element);
|
668
682
|
element = stripCommentsFromElement(element);
|
669
683
|
performAnimation('addClass', className, element, null, null, function() {
|
670
684
|
$delegate.addClass(element, className);
|
@@ -701,6 +715,7 @@ angular.module('ngAnimate', ['ng'])
|
|
701
715
|
* @param {function()=} doneCallback the callback function that will be called once the animation is complete
|
702
716
|
*/
|
703
717
|
removeClass : function(element, className, doneCallback) {
|
718
|
+
element = angular.element(element);
|
704
719
|
element = stripCommentsFromElement(element);
|
705
720
|
performAnimation('removeClass', className, element, null, null, function() {
|
706
721
|
$delegate.removeClass(element, className);
|
@@ -714,7 +729,7 @@ angular.module('ngAnimate', ['ng'])
|
|
714
729
|
* @function
|
715
730
|
* @description Adds and/or removes the given CSS classes to and from the element.
|
716
731
|
* Once complete, the done() callback will be fired (if provided).
|
717
|
-
* @param {DOMElement} element the element which will
|
732
|
+
* @param {DOMElement} element the element which will its CSS classes changed
|
718
733
|
* removed from it
|
719
734
|
* @param {string} add the CSS classes which will be added to the element
|
720
735
|
* @param {string} remove the CSS class which will be removed from the element
|
@@ -722,6 +737,7 @@ angular.module('ngAnimate', ['ng'])
|
|
722
737
|
* CSS classes have been set on the element
|
723
738
|
*/
|
724
739
|
setClass : function(element, add, remove, doneCallback) {
|
740
|
+
element = angular.element(element);
|
725
741
|
element = stripCommentsFromElement(element);
|
726
742
|
performAnimation('setClass', [add, remove], element, null, null, function() {
|
727
743
|
$delegate.setClass(element, add, remove);
|
@@ -731,7 +747,7 @@ angular.module('ngAnimate', ['ng'])
|
|
731
747
|
/**
|
732
748
|
* @ngdoc method
|
733
749
|
* @name $animate#enabled
|
734
|
-
* @function
|
750
|
+
* @kind function
|
735
751
|
*
|
736
752
|
* @param {boolean=} value If provided then set the animation on or off.
|
737
753
|
* @param {DOMElement=} element If provided then the element will be used to represent the enable/disable operation
|
@@ -855,6 +871,7 @@ angular.module('ngAnimate', ['ng'])
|
|
855
871
|
}
|
856
872
|
|
857
873
|
if(skipAnimation) {
|
874
|
+
fireDOMOperation();
|
858
875
|
fireBeforeCallbackAsync();
|
859
876
|
fireAfterCallbackAsync();
|
860
877
|
fireDoneCallbackAsync();
|
@@ -1373,7 +1390,7 @@ angular.module('ngAnimate', ['ng'])
|
|
1373
1390
|
//the jqLite object, so we're safe to use a single variable to house
|
1374
1391
|
//the styles since there is always only one element being animated
|
1375
1392
|
var oldStyle = node.getAttribute('style') || '';
|
1376
|
-
node.setAttribute('style', oldStyle + ' ' + style);
|
1393
|
+
node.setAttribute('style', oldStyle + '; ' + style);
|
1377
1394
|
}
|
1378
1395
|
|
1379
1396
|
element.on(css3AnimationEvents, onAnimationProgress);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -37,18 +37,15 @@ angular.module('ngCookies', ['ng']).
|
|
37
37
|
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
38
38
|
*
|
39
39
|
* @example
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
</script>
|
50
|
-
</file>
|
51
|
-
</example>
|
40
|
+
*
|
41
|
+
* ```js
|
42
|
+
* function ExampleController($cookies) {
|
43
|
+
* // Retrieving a cookie
|
44
|
+
* var favoriteCookie = $cookies.myFavorite;
|
45
|
+
* // Setting a cookie
|
46
|
+
* $cookies.myFavorite = 'oatmeal';
|
47
|
+
* }
|
48
|
+
* ```
|
52
49
|
*/
|
53
50
|
factory('$cookies', ['$rootScope', '$browser', function ($rootScope, $browser) {
|
54
51
|
var cookies = {},
|
@@ -143,6 +140,17 @@ angular.module('ngCookies', ['ng']).
|
|
143
140
|
* Requires the {@link ngCookies `ngCookies`} module to be installed.
|
144
141
|
*
|
145
142
|
* @example
|
143
|
+
*
|
144
|
+
* ```js
|
145
|
+
* function ExampleController($cookies) {
|
146
|
+
* // Put cookie
|
147
|
+
* $cookieStore.put('myFavorite','oatmeal');
|
148
|
+
* // Get cookie
|
149
|
+
* var favoriteCookie = $cookieStore.get('myFavorite');
|
150
|
+
* // Removing a cookie
|
151
|
+
* $cookieStore.remove('myFavorite');
|
152
|
+
* }
|
153
|
+
* ```
|
146
154
|
*/
|
147
155
|
factory('$cookieStore', ['$cookies', function($cookies) {
|
148
156
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
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.2.
|
72
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.18/' +
|
73
73
|
(module ? module + '/' : '') + code;
|
74
74
|
for (i = 2; i < arguments.length; i++) {
|
75
75
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -124,7 +124,7 @@ function setupModuleLoader(window) {
|
|
124
124
|
*
|
125
125
|
* # Module
|
126
126
|
*
|
127
|
-
* A module is a collection of services, directives, filters, and configuration information.
|
127
|
+
* A module is a collection of services, directives, controllers, filters, and configuration information.
|
128
128
|
* `angular.module` is used to configure the {@link auto.$injector $injector}.
|
129
129
|
*
|
130
130
|
* ```js
|
@@ -152,9 +152,9 @@ function setupModuleLoader(window) {
|
|
152
152
|
* {@link angular.bootstrap} to simplify this process for you.
|
153
153
|
*
|
154
154
|
* @param {!string} name The name of the module to create or retrieve.
|
155
|
-
|
156
|
-
|
157
|
-
* @param {Function} configFn Optional configuration function for the module. Same as
|
155
|
+
* @param {!Array.<string>=} requires If specified then new module is being created. If
|
156
|
+
* unspecified then the module is being retrieved for further configuration.
|
157
|
+
* @param {Function=} configFn Optional configuration function for the module. Same as
|
158
158
|
* {@link angular.Module#config Module#config()}.
|
159
159
|
* @returns {module} new module with the {@link angular.Module} api.
|
160
160
|
*/
|
@@ -346,6 +346,8 @@ function setupModuleLoader(window) {
|
|
346
346
|
* configuration.
|
347
347
|
* @description
|
348
348
|
* Use this method to register work which needs to be performed on module loading.
|
349
|
+
* For more about how to configure services, see
|
350
|
+
* {@link providers#providers_provider-recipe Provider Recipe}.
|
349
351
|
*/
|
350
352
|
config: config,
|
351
353
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -900,7 +900,7 @@ angular.mock.dump = function(object) {
|
|
900
900
|
* When an Angular application needs some data from a server, it calls the $http service, which
|
901
901
|
* sends the request to a real server using $httpBackend service. With dependency injection, it is
|
902
902
|
* easy to inject $httpBackend mock (which has the same API as $httpBackend) and use it to verify
|
903
|
-
* the requests and respond with some testing data without sending a request to real server.
|
903
|
+
* the requests and respond with some testing data without sending a request to a real server.
|
904
904
|
*
|
905
905
|
* There are two ways to specify what test data should be returned as http responses by the mock
|
906
906
|
* backend when the code under test makes http requests:
|
@@ -1800,7 +1800,9 @@ angular.module('ngMockE2E', ['ng']).config(['$provide', function($provide) {
|
|
1800
1800
|
*
|
1801
1801
|
* // adds a new phone to the phones array
|
1802
1802
|
* $httpBackend.whenPOST('/phones').respond(function(method, url, data) {
|
1803
|
-
*
|
1803
|
+
* var phone = angular.fromJson(data);
|
1804
|
+
* phones.push(phone);
|
1805
|
+
* return [200, phone, {}];
|
1804
1806
|
* });
|
1805
1807
|
* $httpBackend.whenGET(/^\/templates\//).passThrough();
|
1806
1808
|
* //...
|
@@ -1956,11 +1958,11 @@ if(window.jasmine || window.mocha) {
|
|
1956
1958
|
};
|
1957
1959
|
|
1958
1960
|
|
1959
|
-
beforeEach(function() {
|
1961
|
+
(window.beforeEach || window.setup)(function() {
|
1960
1962
|
currentSpec = this;
|
1961
1963
|
});
|
1962
1964
|
|
1963
|
-
afterEach(function() {
|
1965
|
+
(window.afterEach || window.teardown)(function() {
|
1964
1966
|
var injector = currentSpec.$injector;
|
1965
1967
|
|
1966
1968
|
currentSpec.$injector = null;
|
@@ -2002,7 +2004,7 @@ if(window.jasmine || window.mocha) {
|
|
2002
2004
|
* @param {...(string|Function|Object)} fns any number of modules which are represented as string
|
2003
2005
|
* aliases or as anonymous module initialization functions. The modules are used to
|
2004
2006
|
* configure the injector. The 'ng' and 'ngMock' modules are automatically loaded. If an
|
2005
|
-
* object literal is passed they will be
|
2007
|
+
* object literal is passed they will be registered as values in the module, the key being
|
2006
2008
|
* the module name and the value being what is returned.
|
2007
2009
|
*/
|
2008
2010
|
window.module = angular.mock.module = function() {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -99,8 +99,8 @@ function shallowClearAndCopy(src, dst) {
|
|
99
99
|
* Given a template `/path/:verb` and parameter `{verb:'greet', salutation:'Hello'}` results in
|
100
100
|
* URL `/path/greet?salutation=Hello`.
|
101
101
|
*
|
102
|
-
* If the parameter value is prefixed with `@` then the value of that parameter
|
103
|
-
* the data object (useful for non-GET operations).
|
102
|
+
* If the parameter value is prefixed with `@` then the value of that parameter will be taken
|
103
|
+
* from the corresponding key on the data object (useful for non-GET operations).
|
104
104
|
*
|
105
105
|
* @param {Object.<Object>=} actions Hash with declaration of custom action that should extend
|
106
106
|
* the default set of resource actions. The declaration should be created in the format of {@link
|
@@ -527,23 +527,32 @@ angular.module('ngResource', ['ng']).
|
|
527
527
|
extend({}, extractParams(data, action.params || {}), params),
|
528
528
|
action.url);
|
529
529
|
|
530
|
-
var promise = $http(httpConfig).then(function(response) {
|
530
|
+
var promise = $http(httpConfig).then(function (response) {
|
531
531
|
var data = response.data,
|
532
|
-
|
532
|
+
promise = value.$promise;
|
533
533
|
|
534
534
|
if (data) {
|
535
535
|
// Need to convert action.isArray to boolean in case it is undefined
|
536
536
|
// jshint -W018
|
537
537
|
if (angular.isArray(data) !== (!!action.isArray)) {
|
538
|
-
throw $resourceMinErr('badcfg',
|
539
|
-
|
540
|
-
|
538
|
+
throw $resourceMinErr('badcfg',
|
539
|
+
'Error in resource configuration. Expected ' +
|
540
|
+
'response to contain an {0} but got an {1}',
|
541
|
+
action.isArray ? 'array' : 'object',
|
542
|
+
angular.isArray(data) ? 'array' : 'object');
|
541
543
|
}
|
542
544
|
// jshint +W018
|
543
545
|
if (action.isArray) {
|
544
546
|
value.length = 0;
|
545
|
-
forEach(data, function(item) {
|
546
|
-
|
547
|
+
forEach(data, function (item) {
|
548
|
+
if (typeof item === "object") {
|
549
|
+
value.push(new Resource(item));
|
550
|
+
} else {
|
551
|
+
// Valid JSON values may be string literals, and these should not be converted
|
552
|
+
// into objects. These items will not have access to the Resource prototype
|
553
|
+
// methods, but unfortunately there
|
554
|
+
value.push(item);
|
555
|
+
}
|
547
556
|
});
|
548
557
|
} else {
|
549
558
|
shallowClearAndCopy(data, value);
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -27,7 +27,7 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
|
|
27
27
|
/**
|
28
28
|
* @ngdoc provider
|
29
29
|
* @name $routeProvider
|
30
|
-
* @function
|
30
|
+
* @kind function
|
31
31
|
*
|
32
32
|
* @description
|
33
33
|
*
|
@@ -632,7 +632,7 @@ ngRouteModule.provider('$routeParams', $RouteParamsProvider);
|
|
632
632
|
* // Route: /Chapter/:chapterId/Section/:sectionId
|
633
633
|
* //
|
634
634
|
* // Then
|
635
|
-
* $routeParams ==> {chapterId:1, sectionId:2, search:'moby'}
|
635
|
+
* $routeParams ==> {chapterId:'1', sectionId:'2', search:'moby'}
|
636
636
|
* ```
|
637
637
|
*/
|
638
638
|
function $RouteParamsProvider() {
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.18
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -42,7 +42,7 @@ var $sanitizeMinErr = angular.$$minErr('$sanitize');
|
|
42
42
|
/**
|
43
43
|
* @ngdoc service
|
44
44
|
* @name $sanitize
|
45
|
-
* @function
|
45
|
+
* @kind function
|
46
46
|
*
|
47
47
|
* @description
|
48
48
|
* The input is sanitized by parsing the html into tokens. All safe tokens (from a whitelist) are
|
@@ -166,6 +166,7 @@ var START_TAG_REGEXP =
|
|
166
166
|
COMMENT_REGEXP = /<!--(.*?)-->/g,
|
167
167
|
DOCTYPE_REGEXP = /<!DOCTYPE([^>]*?)>/i,
|
168
168
|
CDATA_REGEXP = /<!\[CDATA\[(.*?)]]>/g,
|
169
|
+
SURROGATE_PAIR_REGEXP = /[\uD800-\uDBFF][\uDC00-\uDFFF]/g,
|
169
170
|
// Match everything outside of normal chars and " (quote character)
|
170
171
|
NON_ALPHANUMERIC_REGEXP = /([^\#-~| |!])/g;
|
171
172
|
|
@@ -404,6 +405,11 @@ function decodeEntities(value) {
|
|
404
405
|
function encodeEntities(value) {
|
405
406
|
return value.
|
406
407
|
replace(/&/g, '&').
|
408
|
+
replace(SURROGATE_PAIR_REGEXP, function (value) {
|
409
|
+
var hi = value.charCodeAt(0);
|
410
|
+
var low = value.charCodeAt(1);
|
411
|
+
return '&#' + (((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000) + ';';
|
412
|
+
}).
|
407
413
|
replace(NON_ALPHANUMERIC_REGEXP, function(value){
|
408
414
|
return '&#' + value.charCodeAt(0) + ';';
|
409
415
|
}).
|
@@ -476,7 +482,7 @@ angular.module('ngSanitize', []).provider('$sanitize', $SanitizeProvider);
|
|
476
482
|
/**
|
477
483
|
* @ngdoc filter
|
478
484
|
* @name linky
|
479
|
-
* @function
|
485
|
+
* @kind function
|
480
486
|
*
|
481
487
|
* @description
|
482
488
|
* Finds links in text input and turns them into html links. Supports http/https/ftp/mailto and
|
@@ -9790,7 +9790,7 @@ if ( typeof module === "object" && module && typeof module.exports === "object"
|
|
9790
9790
|
})( window );
|
9791
9791
|
|
9792
9792
|
/**
|
9793
|
-
* @license AngularJS v1.2.
|
9793
|
+
* @license AngularJS v1.2.18
|
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.2.
|
9863
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.18/' +
|
9864
9864
|
(module ? module + '/' : '') + code;
|
9865
9865
|
for (i = 2; i < arguments.length; i++) {
|
9866
9866
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -9881,7 +9881,6 @@ function minErr(module) {
|
|
9881
9881
|
-push,
|
9882
9882
|
-toString,
|
9883
9883
|
-ngMinErr,
|
9884
|
-
-_angular,
|
9885
9884
|
-angularModule,
|
9886
9885
|
-nodeName_,
|
9887
9886
|
-uid,
|
@@ -9978,7 +9977,7 @@ function minErr(module) {
|
|
9978
9977
|
* @ngdoc function
|
9979
9978
|
* @name angular.lowercase
|
9980
9979
|
* @module ng
|
9981
|
-
* @function
|
9980
|
+
* @kind function
|
9982
9981
|
*
|
9983
9982
|
* @description Converts the specified string to lowercase.
|
9984
9983
|
* @param {string} string String to be converted to lowercase.
|
@@ -9991,7 +9990,7 @@ var hasOwnProperty = Object.prototype.hasOwnProperty;
|
|
9991
9990
|
* @ngdoc function
|
9992
9991
|
* @name angular.uppercase
|
9993
9992
|
* @module ng
|
9994
|
-
* @function
|
9993
|
+
* @kind function
|
9995
9994
|
*
|
9996
9995
|
* @description Converts the specified string to uppercase.
|
9997
9996
|
* @param {string} string String to be converted to uppercase.
|
@@ -10032,8 +10031,6 @@ var /** holds major version number for IE or NaN for real browsers */
|
|
10032
10031
|
toString = Object.prototype.toString,
|
10033
10032
|
ngMinErr = minErr('ng'),
|
10034
10033
|
|
10035
|
-
|
10036
|
-
_angular = window.angular,
|
10037
10034
|
/** @name angular */
|
10038
10035
|
angular = window.angular || (window.angular = {}),
|
10039
10036
|
angularModule,
|
@@ -10075,7 +10072,7 @@ function isArrayLike(obj) {
|
|
10075
10072
|
* @ngdoc function
|
10076
10073
|
* @name angular.forEach
|
10077
10074
|
* @module ng
|
10078
|
-
* @function
|
10075
|
+
* @kind function
|
10079
10076
|
*
|
10080
10077
|
* @description
|
10081
10078
|
* Invokes the `iterator` function once for each item in `obj` collection, which can be either an
|
@@ -10089,7 +10086,7 @@ function isArrayLike(obj) {
|
|
10089
10086
|
```js
|
10090
10087
|
var values = {name: 'misko', gender: 'male'};
|
10091
10088
|
var log = [];
|
10092
|
-
angular.forEach(values, function(value, key){
|
10089
|
+
angular.forEach(values, function(value, key) {
|
10093
10090
|
this.push(key + ': ' + value);
|
10094
10091
|
}, log);
|
10095
10092
|
expect(log).toEqual(['name: misko', 'gender: male']);
|
@@ -10103,7 +10100,7 @@ function isArrayLike(obj) {
|
|
10103
10100
|
function forEach(obj, iterator, context) {
|
10104
10101
|
var key;
|
10105
10102
|
if (obj) {
|
10106
|
-
if (isFunction(obj)){
|
10103
|
+
if (isFunction(obj)) {
|
10107
10104
|
for (key in obj) {
|
10108
10105
|
// Need to check if hasOwnProperty exists,
|
10109
10106
|
// as on IE8 the result of querySelectorAll is an object without a hasOwnProperty function
|
@@ -10204,7 +10201,7 @@ function setHashKey(obj, h) {
|
|
10204
10201
|
* @ngdoc function
|
10205
10202
|
* @name angular.extend
|
10206
10203
|
* @module ng
|
10207
|
-
* @function
|
10204
|
+
* @kind function
|
10208
10205
|
*
|
10209
10206
|
* @description
|
10210
10207
|
* Extends the destination object `dst` by copying all of the properties from the `src` object(s)
|
@@ -10216,9 +10213,9 @@ function setHashKey(obj, h) {
|
|
10216
10213
|
*/
|
10217
10214
|
function extend(dst) {
|
10218
10215
|
var h = dst.$$hashKey;
|
10219
|
-
forEach(arguments, function(obj){
|
10216
|
+
forEach(arguments, function(obj) {
|
10220
10217
|
if (obj !== dst) {
|
10221
|
-
forEach(obj, function(value, key){
|
10218
|
+
forEach(obj, function(value, key) {
|
10222
10219
|
dst[key] = value;
|
10223
10220
|
});
|
10224
10221
|
}
|
@@ -10241,7 +10238,7 @@ function inherit(parent, extra) {
|
|
10241
10238
|
* @ngdoc function
|
10242
10239
|
* @name angular.noop
|
10243
10240
|
* @module ng
|
10244
|
-
* @function
|
10241
|
+
* @kind function
|
10245
10242
|
*
|
10246
10243
|
* @description
|
10247
10244
|
* A function that performs no operations. This function can be useful when writing code in the
|
@@ -10261,7 +10258,7 @@ noop.$inject = [];
|
|
10261
10258
|
* @ngdoc function
|
10262
10259
|
* @name angular.identity
|
10263
10260
|
* @module ng
|
10264
|
-
* @function
|
10261
|
+
* @kind function
|
10265
10262
|
*
|
10266
10263
|
* @description
|
10267
10264
|
* A function that returns its first argument. This function is useful when writing code in the
|
@@ -10283,7 +10280,7 @@ function valueFn(value) {return function() {return value;};}
|
|
10283
10280
|
* @ngdoc function
|
10284
10281
|
* @name angular.isUndefined
|
10285
10282
|
* @module ng
|
10286
|
-
* @function
|
10283
|
+
* @kind function
|
10287
10284
|
*
|
10288
10285
|
* @description
|
10289
10286
|
* Determines if a reference is undefined.
|
@@ -10298,7 +10295,7 @@ function isUndefined(value){return typeof value === 'undefined';}
|
|
10298
10295
|
* @ngdoc function
|
10299
10296
|
* @name angular.isDefined
|
10300
10297
|
* @module ng
|
10301
|
-
* @function
|
10298
|
+
* @kind function
|
10302
10299
|
*
|
10303
10300
|
* @description
|
10304
10301
|
* Determines if a reference is defined.
|
@@ -10313,7 +10310,7 @@ function isDefined(value){return typeof value !== 'undefined';}
|
|
10313
10310
|
* @ngdoc function
|
10314
10311
|
* @name angular.isObject
|
10315
10312
|
* @module ng
|
10316
|
-
* @function
|
10313
|
+
* @kind function
|
10317
10314
|
*
|
10318
10315
|
* @description
|
10319
10316
|
* Determines if a reference is an `Object`. Unlike `typeof` in JavaScript, `null`s are not
|
@@ -10329,7 +10326,7 @@ function isObject(value){return value != null && typeof value === 'object';}
|
|
10329
10326
|
* @ngdoc function
|
10330
10327
|
* @name angular.isString
|
10331
10328
|
* @module ng
|
10332
|
-
* @function
|
10329
|
+
* @kind function
|
10333
10330
|
*
|
10334
10331
|
* @description
|
10335
10332
|
* Determines if a reference is a `String`.
|
@@ -10344,7 +10341,7 @@ function isString(value){return typeof value === 'string';}
|
|
10344
10341
|
* @ngdoc function
|
10345
10342
|
* @name angular.isNumber
|
10346
10343
|
* @module ng
|
10347
|
-
* @function
|
10344
|
+
* @kind function
|
10348
10345
|
*
|
10349
10346
|
* @description
|
10350
10347
|
* Determines if a reference is a `Number`.
|
@@ -10359,7 +10356,7 @@ function isNumber(value){return typeof value === 'number';}
|
|
10359
10356
|
* @ngdoc function
|
10360
10357
|
* @name angular.isDate
|
10361
10358
|
* @module ng
|
10362
|
-
* @function
|
10359
|
+
* @kind function
|
10363
10360
|
*
|
10364
10361
|
* @description
|
10365
10362
|
* Determines if a value is a date.
|
@@ -10367,7 +10364,7 @@ function isNumber(value){return typeof value === 'number';}
|
|
10367
10364
|
* @param {*} value Reference to check.
|
10368
10365
|
* @returns {boolean} True if `value` is a `Date`.
|
10369
10366
|
*/
|
10370
|
-
function isDate(value){
|
10367
|
+
function isDate(value) {
|
10371
10368
|
return toString.call(value) === '[object Date]';
|
10372
10369
|
}
|
10373
10370
|
|
@@ -10376,7 +10373,7 @@ function isDate(value){
|
|
10376
10373
|
* @ngdoc function
|
10377
10374
|
* @name angular.isArray
|
10378
10375
|
* @module ng
|
10379
|
-
* @function
|
10376
|
+
* @kind function
|
10380
10377
|
*
|
10381
10378
|
* @description
|
10382
10379
|
* Determines if a reference is an `Array`.
|
@@ -10384,16 +10381,20 @@ function isDate(value){
|
|
10384
10381
|
* @param {*} value Reference to check.
|
10385
10382
|
* @returns {boolean} True if `value` is an `Array`.
|
10386
10383
|
*/
|
10387
|
-
|
10388
|
-
|
10389
|
-
|
10390
|
-
|
10384
|
+
var isArray = (function() {
|
10385
|
+
if (!isFunction(Array.isArray)) {
|
10386
|
+
return function(value) {
|
10387
|
+
return toString.call(value) === '[object Array]';
|
10388
|
+
};
|
10389
|
+
}
|
10390
|
+
return Array.isArray;
|
10391
|
+
})();
|
10391
10392
|
|
10392
10393
|
/**
|
10393
10394
|
* @ngdoc function
|
10394
10395
|
* @name angular.isFunction
|
10395
10396
|
* @module ng
|
10396
|
-
* @function
|
10397
|
+
* @kind function
|
10397
10398
|
*
|
10398
10399
|
* @description
|
10399
10400
|
* Determines if a reference is a `Function`.
|
@@ -10467,7 +10468,7 @@ var trim = (function() {
|
|
10467
10468
|
* @ngdoc function
|
10468
10469
|
* @name angular.isElement
|
10469
10470
|
* @module ng
|
10470
|
-
* @function
|
10471
|
+
* @kind function
|
10471
10472
|
*
|
10472
10473
|
* @description
|
10473
10474
|
* Determines if a reference is a DOM element (or wrapped jQuery element).
|
@@ -10485,7 +10486,7 @@ function isElement(node) {
|
|
10485
10486
|
* @param str 'key1,key2,...'
|
10486
10487
|
* @returns {object} in the form of {key1:true, key2:true, ...}
|
10487
10488
|
*/
|
10488
|
-
function makeMap(str){
|
10489
|
+
function makeMap(str) {
|
10489
10490
|
var obj = {}, items = str.split(","), i;
|
10490
10491
|
for ( i = 0; i < items.length; i++ )
|
10491
10492
|
obj[ items[i] ] = true;
|
@@ -10532,7 +10533,7 @@ function size(obj, ownPropsOnly) {
|
|
10532
10533
|
|
10533
10534
|
if (isArray(obj) || isString(obj)) {
|
10534
10535
|
return obj.length;
|
10535
|
-
} else if (isObject(obj)){
|
10536
|
+
} else if (isObject(obj)) {
|
10536
10537
|
for (key in obj)
|
10537
10538
|
if (!ownPropsOnly || obj.hasOwnProperty(key))
|
10538
10539
|
count++;
|
@@ -10578,7 +10579,7 @@ function isLeafNode (node) {
|
|
10578
10579
|
* @ngdoc function
|
10579
10580
|
* @name angular.copy
|
10580
10581
|
* @module ng
|
10581
|
-
* @function
|
10582
|
+
* @kind function
|
10582
10583
|
*
|
10583
10584
|
* @description
|
10584
10585
|
* Creates a deep copy of `source`, which should be an object or an array.
|
@@ -10631,7 +10632,7 @@ function isLeafNode (node) {
|
|
10631
10632
|
</file>
|
10632
10633
|
</example>
|
10633
10634
|
*/
|
10634
|
-
function copy(source, destination){
|
10635
|
+
function copy(source, destination, stackSource, stackDest) {
|
10635
10636
|
if (isWindow(source) || isScope(source)) {
|
10636
10637
|
throw ngMinErr('cpws',
|
10637
10638
|
"Can't copy! Making copies of Window or Scope instances is not supported.");
|
@@ -10641,52 +10642,82 @@ function copy(source, destination){
|
|
10641
10642
|
destination = source;
|
10642
10643
|
if (source) {
|
10643
10644
|
if (isArray(source)) {
|
10644
|
-
destination = copy(source, []);
|
10645
|
+
destination = copy(source, [], stackSource, stackDest);
|
10645
10646
|
} else if (isDate(source)) {
|
10646
10647
|
destination = new Date(source.getTime());
|
10647
10648
|
} else if (isRegExp(source)) {
|
10648
10649
|
destination = new RegExp(source.source);
|
10649
10650
|
} else if (isObject(source)) {
|
10650
|
-
destination = copy(source, {});
|
10651
|
+
destination = copy(source, {}, stackSource, stackDest);
|
10651
10652
|
}
|
10652
10653
|
}
|
10653
10654
|
} else {
|
10654
10655
|
if (source === destination) throw ngMinErr('cpi',
|
10655
10656
|
"Can't copy! Source and destination are identical.");
|
10657
|
+
|
10658
|
+
stackSource = stackSource || [];
|
10659
|
+
stackDest = stackDest || [];
|
10660
|
+
|
10661
|
+
if (isObject(source)) {
|
10662
|
+
var index = indexOf(stackSource, source);
|
10663
|
+
if (index !== -1) return stackDest[index];
|
10664
|
+
|
10665
|
+
stackSource.push(source);
|
10666
|
+
stackDest.push(destination);
|
10667
|
+
}
|
10668
|
+
|
10669
|
+
var result;
|
10656
10670
|
if (isArray(source)) {
|
10657
10671
|
destination.length = 0;
|
10658
10672
|
for ( var i = 0; i < source.length; i++) {
|
10659
|
-
|
10673
|
+
result = copy(source[i], null, stackSource, stackDest);
|
10674
|
+
if (isObject(source[i])) {
|
10675
|
+
stackSource.push(source[i]);
|
10676
|
+
stackDest.push(result);
|
10677
|
+
}
|
10678
|
+
destination.push(result);
|
10660
10679
|
}
|
10661
10680
|
} else {
|
10662
10681
|
var h = destination.$$hashKey;
|
10663
|
-
forEach(destination, function(value, key){
|
10682
|
+
forEach(destination, function(value, key) {
|
10664
10683
|
delete destination[key];
|
10665
10684
|
});
|
10666
10685
|
for ( var key in source) {
|
10667
|
-
|
10686
|
+
result = copy(source[key], null, stackSource, stackDest);
|
10687
|
+
if (isObject(source[key])) {
|
10688
|
+
stackSource.push(source[key]);
|
10689
|
+
stackDest.push(result);
|
10690
|
+
}
|
10691
|
+
destination[key] = result;
|
10668
10692
|
}
|
10669
10693
|
setHashKey(destination,h);
|
10670
10694
|
}
|
10695
|
+
|
10671
10696
|
}
|
10672
10697
|
return destination;
|
10673
10698
|
}
|
10674
10699
|
|
10675
10700
|
/**
|
10676
|
-
*
|
10701
|
+
* Creates a shallow copy of an object, an array or a primitive
|
10677
10702
|
*/
|
10678
10703
|
function shallowCopy(src, dst) {
|
10679
|
-
|
10704
|
+
if (isArray(src)) {
|
10705
|
+
dst = dst || [];
|
10706
|
+
|
10707
|
+
for ( var i = 0; i < src.length; i++) {
|
10708
|
+
dst[i] = src[i];
|
10709
|
+
}
|
10710
|
+
} else if (isObject(src)) {
|
10711
|
+
dst = dst || {};
|
10680
10712
|
|
10681
|
-
|
10682
|
-
|
10683
|
-
|
10684
|
-
|
10685
|
-
dst[key] = src[key];
|
10713
|
+
for (var key in src) {
|
10714
|
+
if (hasOwnProperty.call(src, key) && !(key.charAt(0) === '$' && key.charAt(1) === '$')) {
|
10715
|
+
dst[key] = src[key];
|
10716
|
+
}
|
10686
10717
|
}
|
10687
10718
|
}
|
10688
10719
|
|
10689
|
-
return dst;
|
10720
|
+
return dst || src;
|
10690
10721
|
}
|
10691
10722
|
|
10692
10723
|
|
@@ -10694,7 +10725,7 @@ function shallowCopy(src, dst) {
|
|
10694
10725
|
* @ngdoc function
|
10695
10726
|
* @name angular.equals
|
10696
10727
|
* @module ng
|
10697
|
-
* @function
|
10728
|
+
* @kind function
|
10698
10729
|
*
|
10699
10730
|
* @description
|
10700
10731
|
* Determines if two objects or two values are equivalent. Supports value types, regular
|
@@ -10706,7 +10737,7 @@ function shallowCopy(src, dst) {
|
|
10706
10737
|
* * Both objects or values are of the same type and all of their properties are equal by
|
10707
10738
|
* comparing them with `angular.equals`.
|
10708
10739
|
* * Both values are NaN. (In JavaScript, NaN == NaN => false. But we consider two NaN as equal)
|
10709
|
-
* * Both values represent the same regular expression (In
|
10740
|
+
* * Both values represent the same regular expression (In JavaScript,
|
10710
10741
|
* /abc/ == /abc/ => false. But we consider two regular expressions as equal when their textual
|
10711
10742
|
* representation matches).
|
10712
10743
|
*
|
@@ -10781,7 +10812,7 @@ function sliceArgs(args, startIndex) {
|
|
10781
10812
|
* @ngdoc function
|
10782
10813
|
* @name angular.bind
|
10783
10814
|
* @module ng
|
10784
|
-
* @function
|
10815
|
+
* @kind function
|
10785
10816
|
*
|
10786
10817
|
* @description
|
10787
10818
|
* Returns a function which calls function `fn` bound to `self` (`self` becomes the `this` for
|
@@ -10837,7 +10868,7 @@ function toJsonReplacer(key, value) {
|
|
10837
10868
|
* @ngdoc function
|
10838
10869
|
* @name angular.toJson
|
10839
10870
|
* @module ng
|
10840
|
-
* @function
|
10871
|
+
* @kind function
|
10841
10872
|
*
|
10842
10873
|
* @description
|
10843
10874
|
* Serializes input into a JSON-formatted string. Properties with leading $ characters will be
|
@@ -10857,7 +10888,7 @@ function toJson(obj, pretty) {
|
|
10857
10888
|
* @ngdoc function
|
10858
10889
|
* @name angular.fromJson
|
10859
10890
|
* @module ng
|
10860
|
-
* @function
|
10891
|
+
* @kind function
|
10861
10892
|
*
|
10862
10893
|
* @description
|
10863
10894
|
* Deserializes a JSON string.
|
@@ -10934,7 +10965,7 @@ function tryDecodeURIComponent(value) {
|
|
10934
10965
|
*/
|
10935
10966
|
function parseKeyValue(/**string*/keyValue) {
|
10936
10967
|
var obj = {}, key_value, key;
|
10937
|
-
forEach((keyValue || "").split('&'), function(keyValue){
|
10968
|
+
forEach((keyValue || "").split('&'), function(keyValue) {
|
10938
10969
|
if ( keyValue ) {
|
10939
10970
|
key_value = keyValue.split('=');
|
10940
10971
|
key = tryDecodeURIComponent(key_value[0]);
|
@@ -11196,7 +11227,7 @@ function bootstrap(element, modules) {
|
|
11196
11227
|
}
|
11197
11228
|
|
11198
11229
|
var SNAKE_CASE_REGEXP = /[A-Z]/g;
|
11199
|
-
function snake_case(name, separator){
|
11230
|
+
function snake_case(name, separator) {
|
11200
11231
|
separator = separator || '_';
|
11201
11232
|
return name.replace(SNAKE_CASE_REGEXP, function(letter, pos) {
|
11202
11233
|
return (pos ? separator : '') + letter.toLowerCase();
|
@@ -11206,8 +11237,9 @@ function snake_case(name, separator){
|
|
11206
11237
|
function bindJQuery() {
|
11207
11238
|
// bind to jQuery if present;
|
11208
11239
|
jQuery = window.jQuery;
|
11209
|
-
//
|
11210
|
-
|
11240
|
+
// Use jQuery if it exists with proper functionality, otherwise default to us.
|
11241
|
+
// Angular 1.2+ requires jQuery 1.7.1+ for on()/off() support.
|
11242
|
+
if (jQuery && jQuery.fn.on) {
|
11211
11243
|
jqLite = jQuery;
|
11212
11244
|
extend(jQuery.fn, {
|
11213
11245
|
scope: JQLitePrototype.scope,
|
@@ -11353,7 +11385,7 @@ function setupModuleLoader(window) {
|
|
11353
11385
|
*
|
11354
11386
|
* # Module
|
11355
11387
|
*
|
11356
|
-
* A module is a collection of services, directives, filters, and configuration information.
|
11388
|
+
* A module is a collection of services, directives, controllers, filters, and configuration information.
|
11357
11389
|
* `angular.module` is used to configure the {@link auto.$injector $injector}.
|
11358
11390
|
*
|
11359
11391
|
* ```js
|
@@ -11381,9 +11413,9 @@ function setupModuleLoader(window) {
|
|
11381
11413
|
* {@link angular.bootstrap} to simplify this process for you.
|
11382
11414
|
*
|
11383
11415
|
* @param {!string} name The name of the module to create or retrieve.
|
11384
|
-
|
11385
|
-
|
11386
|
-
* @param {Function} configFn Optional configuration function for the module. Same as
|
11416
|
+
* @param {!Array.<string>=} requires If specified then new module is being created. If
|
11417
|
+
* unspecified then the module is being retrieved for further configuration.
|
11418
|
+
* @param {Function=} configFn Optional configuration function for the module. Same as
|
11387
11419
|
* {@link angular.Module#config Module#config()}.
|
11388
11420
|
* @returns {module} new module with the {@link angular.Module} api.
|
11389
11421
|
*/
|
@@ -11575,6 +11607,8 @@ function setupModuleLoader(window) {
|
|
11575
11607
|
* configuration.
|
11576
11608
|
* @description
|
11577
11609
|
* Use this method to register work which needs to be performed on module loading.
|
11610
|
+
* For more about how to configure services, see
|
11611
|
+
* {@link providers#providers_provider-recipe Provider Recipe}.
|
11578
11612
|
*/
|
11579
11613
|
config: config,
|
11580
11614
|
|
@@ -11711,11 +11745,11 @@ function setupModuleLoader(window) {
|
|
11711
11745
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
11712
11746
|
*/
|
11713
11747
|
var version = {
|
11714
|
-
full: '1.2.
|
11748
|
+
full: '1.2.18', // all of these placeholder strings will be replaced by grunt's
|
11715
11749
|
major: 1, // package task
|
11716
11750
|
minor: 2,
|
11717
|
-
dot:
|
11718
|
-
codeName: '
|
11751
|
+
dot: 18,
|
11752
|
+
codeName: 'ear-extendability'
|
11719
11753
|
};
|
11720
11754
|
|
11721
11755
|
|
@@ -11855,7 +11889,7 @@ function publishExternalAPI(angular){
|
|
11855
11889
|
* @ngdoc function
|
11856
11890
|
* @name angular.element
|
11857
11891
|
* @module ng
|
11858
|
-
* @function
|
11892
|
+
* @kind function
|
11859
11893
|
*
|
11860
11894
|
* @description
|
11861
11895
|
* Wraps a raw DOM element or HTML string as a [jQuery](http://jquery.com) element.
|
@@ -11938,7 +11972,7 @@ function publishExternalAPI(angular){
|
|
11938
11972
|
*/
|
11939
11973
|
|
11940
11974
|
var jqCache = JQLite.cache = {},
|
11941
|
-
jqName = JQLite.expando = 'ng
|
11975
|
+
jqName = JQLite.expando = 'ng' + new Date().getTime(),
|
11942
11976
|
jqId = 1,
|
11943
11977
|
addEventListenerFn = (window.document.addEventListener
|
11944
11978
|
? function(element, type, fn) {element.addEventListener(type, fn, false);}
|
@@ -12491,6 +12525,7 @@ forEach({
|
|
12491
12525
|
*/
|
12492
12526
|
JQLite.prototype[name] = function(arg1, arg2) {
|
12493
12527
|
var i, key;
|
12528
|
+
var nodeCount = this.length;
|
12494
12529
|
|
12495
12530
|
// jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
|
12496
12531
|
// in a way that survives minification.
|
@@ -12500,7 +12535,7 @@ forEach({
|
|
12500
12535
|
if (isObject(arg1)) {
|
12501
12536
|
|
12502
12537
|
// we are a write, but the object properties are the key/values
|
12503
|
-
for (i = 0; i <
|
12538
|
+
for (i = 0; i < nodeCount; i++) {
|
12504
12539
|
if (fn === jqLiteData) {
|
12505
12540
|
// data() takes the whole object in jQuery
|
12506
12541
|
fn(this[i], arg1);
|
@@ -12514,9 +12549,10 @@ forEach({
|
|
12514
12549
|
return this;
|
12515
12550
|
} else {
|
12516
12551
|
// we are a read, so read the first child.
|
12552
|
+
// TODO: do we still need this?
|
12517
12553
|
var value = fn.$dv;
|
12518
12554
|
// Only if we have $dv do we iterate over all, otherwise it is just the first element.
|
12519
|
-
var jj = (value === undefined) ? Math.min(
|
12555
|
+
var jj = (value === undefined) ? Math.min(nodeCount, 1) : nodeCount;
|
12520
12556
|
for (var j = 0; j < jj; j++) {
|
12521
12557
|
var nodeValue = fn(this[j], arg1, arg2);
|
12522
12558
|
value = value ? value + nodeValue : nodeValue;
|
@@ -12525,7 +12561,7 @@ forEach({
|
|
12525
12561
|
}
|
12526
12562
|
} else {
|
12527
12563
|
// we are a write, so apply to all children
|
12528
|
-
for (i = 0; i <
|
12564
|
+
for (i = 0; i < nodeCount; i++) {
|
12529
12565
|
fn(this[i], arg1, arg2);
|
12530
12566
|
}
|
12531
12567
|
// return self for chaining
|
@@ -12894,7 +12930,7 @@ HashMap.prototype = {
|
|
12894
12930
|
* @ngdoc function
|
12895
12931
|
* @module ng
|
12896
12932
|
* @name angular.injector
|
12897
|
-
* @function
|
12933
|
+
* @kind function
|
12898
12934
|
*
|
12899
12935
|
* @description
|
12900
12936
|
* Creates an injector function that can be used for retrieving services as well as for
|
@@ -12921,7 +12957,7 @@ HashMap.prototype = {
|
|
12921
12957
|
*
|
12922
12958
|
* Sometimes you want to get access to the injector of a currently running Angular app
|
12923
12959
|
* from outside Angular. Perhaps, you want to inject and compile some markup after the
|
12924
|
-
* application has been bootstrapped. You can do this using extra `injector()` added
|
12960
|
+
* application has been bootstrapped. You can do this using the extra `injector()` added
|
12925
12961
|
* to JQuery/jqLite elements. See {@link angular.element}.
|
12926
12962
|
*
|
12927
12963
|
* *This is fairly rare but could be the case if a third party library is injecting the
|
@@ -12991,7 +13027,7 @@ function annotate(fn) {
|
|
12991
13027
|
/**
|
12992
13028
|
* @ngdoc service
|
12993
13029
|
* @name $injector
|
12994
|
-
* @function
|
13030
|
+
* @kind function
|
12995
13031
|
*
|
12996
13032
|
* @description
|
12997
13033
|
*
|
@@ -13034,7 +13070,7 @@ function annotate(fn) {
|
|
13034
13070
|
* minification, and obfuscation tools since these tools change the argument names.
|
13035
13071
|
*
|
13036
13072
|
* ## `$inject` Annotation
|
13037
|
-
* By adding
|
13073
|
+
* By adding an `$inject` property onto a function the injection parameters can be specified.
|
13038
13074
|
*
|
13039
13075
|
* ## Inline
|
13040
13076
|
* As an array of injection names, where the last item in the array is the function to call.
|
@@ -13071,7 +13107,7 @@ function annotate(fn) {
|
|
13071
13107
|
* @name $injector#has
|
13072
13108
|
*
|
13073
13109
|
* @description
|
13074
|
-
* Allows the user to query if the particular service
|
13110
|
+
* Allows the user to query if the particular service exists.
|
13075
13111
|
*
|
13076
13112
|
* @param {string} Name of the service to query.
|
13077
13113
|
* @returns {boolean} returns true if injector has given service.
|
@@ -13081,8 +13117,8 @@ function annotate(fn) {
|
|
13081
13117
|
* @ngdoc method
|
13082
13118
|
* @name $injector#instantiate
|
13083
13119
|
* @description
|
13084
|
-
* Create a new instance of JS type. The method takes a constructor function invokes the new
|
13085
|
-
* operator and supplies all of the arguments to the constructor function as specified by the
|
13120
|
+
* Create a new instance of JS type. The method takes a constructor function, invokes the new
|
13121
|
+
* operator, and supplies all of the arguments to the constructor function as specified by the
|
13086
13122
|
* constructor annotation.
|
13087
13123
|
*
|
13088
13124
|
* @param {Function} Type Annotated constructor function.
|
@@ -13614,7 +13650,8 @@ function createInjector(modulesToLoad) {
|
|
13614
13650
|
function getService(serviceName) {
|
13615
13651
|
if (cache.hasOwnProperty(serviceName)) {
|
13616
13652
|
if (cache[serviceName] === INSTANTIATING) {
|
13617
|
-
throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
|
13653
|
+
throw $injectorMinErr('cdep', 'Circular dependency found: {0}',
|
13654
|
+
serviceName + ' <- ' + path.join(' <- '));
|
13618
13655
|
}
|
13619
13656
|
return cache[serviceName];
|
13620
13657
|
} else {
|
@@ -13695,7 +13732,7 @@ function createInjector(modulesToLoad) {
|
|
13695
13732
|
* @requires $rootScope
|
13696
13733
|
*
|
13697
13734
|
* @description
|
13698
|
-
* When called, it checks current value of `$location.hash()` and
|
13735
|
+
* When called, it checks current value of `$location.hash()` and scrolls to the related element,
|
13699
13736
|
* according to rules specified in
|
13700
13737
|
* [Html5 spec](http://dev.w3.org/html5/spec/Overview.html#the-indicated-part-of-the-document).
|
13701
13738
|
*
|
@@ -13897,7 +13934,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
13897
13934
|
*
|
13898
13935
|
* @ngdoc method
|
13899
13936
|
* @name $animate#enter
|
13900
|
-
* @function
|
13937
|
+
* @kind function
|
13901
13938
|
* @description Inserts the element into the DOM either after the `after` element or within
|
13902
13939
|
* the `parent` element. Once complete, the done() callback will be fired (if provided).
|
13903
13940
|
* @param {DOMElement} element the element which will be inserted into the DOM
|
@@ -13924,7 +13961,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
13924
13961
|
*
|
13925
13962
|
* @ngdoc method
|
13926
13963
|
* @name $animate#leave
|
13927
|
-
* @function
|
13964
|
+
* @kind function
|
13928
13965
|
* @description Removes the element from the DOM. Once complete, the done() callback will be
|
13929
13966
|
* fired (if provided).
|
13930
13967
|
* @param {DOMElement} element the element which will be removed from the DOM
|
@@ -13940,7 +13977,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
13940
13977
|
*
|
13941
13978
|
* @ngdoc method
|
13942
13979
|
* @name $animate#move
|
13943
|
-
* @function
|
13980
|
+
* @kind function
|
13944
13981
|
* @description Moves the position of the provided element within the DOM to be placed
|
13945
13982
|
* either after the `after` element or inside of the `parent` element. Once complete, the
|
13946
13983
|
* done() callback will be fired (if provided).
|
@@ -13964,7 +14001,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
13964
14001
|
*
|
13965
14002
|
* @ngdoc method
|
13966
14003
|
* @name $animate#addClass
|
13967
|
-
* @function
|
14004
|
+
* @kind function
|
13968
14005
|
* @description Adds the provided className CSS class value to the provided element. Once
|
13969
14006
|
* complete, the done() callback will be fired (if provided).
|
13970
14007
|
* @param {DOMElement} element the element which will have the className value
|
@@ -13987,7 +14024,7 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
13987
14024
|
*
|
13988
14025
|
* @ngdoc method
|
13989
14026
|
* @name $animate#removeClass
|
13990
|
-
* @function
|
14027
|
+
* @kind function
|
13991
14028
|
* @description Removes the provided className CSS class value from the provided element.
|
13992
14029
|
* Once complete, the done() callback will be fired (if provided).
|
13993
14030
|
* @param {DOMElement} element the element which will have the className value
|
@@ -14010,10 +14047,10 @@ var $AnimateProvider = ['$provide', function($provide) {
|
|
14010
14047
|
*
|
14011
14048
|
* @ngdoc method
|
14012
14049
|
* @name $animate#setClass
|
14013
|
-
* @function
|
14050
|
+
* @kind function
|
14014
14051
|
* @description Adds and/or removes the given CSS classes to and from the element.
|
14015
14052
|
* Once complete, the done() callback will be fired (if provided).
|
14016
|
-
* @param {DOMElement} element the element which will
|
14053
|
+
* @param {DOMElement} element the element which will have its CSS classes changed
|
14017
14054
|
* removed from it
|
14018
14055
|
* @param {string} add the CSS classes which will be added to the element
|
14019
14056
|
* @param {string} remove the CSS class which will be removed from the element
|
@@ -14567,7 +14604,7 @@ function $CacheFactoryProvider() {
|
|
14567
14604
|
/**
|
14568
14605
|
* @ngdoc method
|
14569
14606
|
* @name $cacheFactory.Cache#put
|
14570
|
-
* @function
|
14607
|
+
* @kind function
|
14571
14608
|
*
|
14572
14609
|
* @description
|
14573
14610
|
* Inserts a named entry into the {@link $cacheFactory.Cache Cache} object to be
|
@@ -14603,7 +14640,7 @@ function $CacheFactoryProvider() {
|
|
14603
14640
|
/**
|
14604
14641
|
* @ngdoc method
|
14605
14642
|
* @name $cacheFactory.Cache#get
|
14606
|
-
* @function
|
14643
|
+
* @kind function
|
14607
14644
|
*
|
14608
14645
|
* @description
|
14609
14646
|
* Retrieves named data stored in the {@link $cacheFactory.Cache Cache} object.
|
@@ -14627,7 +14664,7 @@ function $CacheFactoryProvider() {
|
|
14627
14664
|
/**
|
14628
14665
|
* @ngdoc method
|
14629
14666
|
* @name $cacheFactory.Cache#remove
|
14630
|
-
* @function
|
14667
|
+
* @kind function
|
14631
14668
|
*
|
14632
14669
|
* @description
|
14633
14670
|
* Removes an entry from the {@link $cacheFactory.Cache Cache} object.
|
@@ -14655,7 +14692,7 @@ function $CacheFactoryProvider() {
|
|
14655
14692
|
/**
|
14656
14693
|
* @ngdoc method
|
14657
14694
|
* @name $cacheFactory.Cache#removeAll
|
14658
|
-
* @function
|
14695
|
+
* @kind function
|
14659
14696
|
*
|
14660
14697
|
* @description
|
14661
14698
|
* Clears the cache object of any entries.
|
@@ -14671,7 +14708,7 @@ function $CacheFactoryProvider() {
|
|
14671
14708
|
/**
|
14672
14709
|
* @ngdoc method
|
14673
14710
|
* @name $cacheFactory.Cache#destroy
|
14674
|
-
* @function
|
14711
|
+
* @kind function
|
14675
14712
|
*
|
14676
14713
|
* @description
|
14677
14714
|
* Destroys the {@link $cacheFactory.Cache Cache} object entirely,
|
@@ -14688,7 +14725,7 @@ function $CacheFactoryProvider() {
|
|
14688
14725
|
/**
|
14689
14726
|
* @ngdoc method
|
14690
14727
|
* @name $cacheFactory.Cache#info
|
14691
|
-
* @function
|
14728
|
+
* @kind function
|
14692
14729
|
*
|
14693
14730
|
* @description
|
14694
14731
|
* Retrieve information regarding a particular {@link $cacheFactory.Cache Cache}.
|
@@ -14743,7 +14780,7 @@ function $CacheFactoryProvider() {
|
|
14743
14780
|
* @name $cacheFactory#info
|
14744
14781
|
*
|
14745
14782
|
* @description
|
14746
|
-
* Get information about all the
|
14783
|
+
* Get information about all the caches that have been created
|
14747
14784
|
*
|
14748
14785
|
* @returns {Object} - key-value map of `cacheId` to the result of calling `cache#info`
|
14749
14786
|
*/
|
@@ -14844,7 +14881,7 @@ function $TemplateCacheProvider() {
|
|
14844
14881
|
/**
|
14845
14882
|
* @ngdoc service
|
14846
14883
|
* @name $compile
|
14847
|
-
* @function
|
14884
|
+
* @kind function
|
14848
14885
|
*
|
14849
14886
|
* @description
|
14850
14887
|
* Compiles an HTML string or DOM into a template and produces a template function, which
|
@@ -14882,7 +14919,6 @@ function $TemplateCacheProvider() {
|
|
14882
14919
|
* template: '<div></div>', // or // function(tElement, tAttrs) { ... },
|
14883
14920
|
* // or
|
14884
14921
|
* // templateUrl: 'directive.html', // or // function(tElement, tAttrs) { ... },
|
14885
|
-
* replace: false,
|
14886
14922
|
* transclude: false,
|
14887
14923
|
* restrict: 'A',
|
14888
14924
|
* scope: false,
|
@@ -15058,7 +15094,7 @@ function $TemplateCacheProvider() {
|
|
15058
15094
|
* api/ng.$sce#getTrustedResourceUrl $sce.getTrustedResourceUrl}.
|
15059
15095
|
*
|
15060
15096
|
*
|
15061
|
-
* #### `replace`
|
15097
|
+
* #### `replace` ([*DEPRECATED*!], will be removed in next major release)
|
15062
15098
|
* specify where the template should be inserted. Defaults to `false`.
|
15063
15099
|
*
|
15064
15100
|
* * `true` - the template will replace the current element.
|
@@ -15085,11 +15121,7 @@ function $TemplateCacheProvider() {
|
|
15085
15121
|
* ```
|
15086
15122
|
*
|
15087
15123
|
* The compile function deals with transforming the template DOM. Since most directives do not do
|
15088
|
-
* template transformation, it is not used often.
|
15089
|
-
* directives that transform template DOM, such as {@link
|
15090
|
-
* api/ng.directive:ngRepeat ngRepeat}, or load the contents
|
15091
|
-
* asynchronously, such as {@link ngRoute.directive:ngView ngView}. The
|
15092
|
-
* compile function takes the following arguments.
|
15124
|
+
* template transformation, it is not used often. The compile function takes the following arguments:
|
15093
15125
|
*
|
15094
15126
|
* * `tElement` - template element - The element where the directive has been declared. It is
|
15095
15127
|
* safe to do template transformation on the element and child elements only.
|
@@ -15327,7 +15359,7 @@ var $compileMinErr = minErr('$compile');
|
|
15327
15359
|
/**
|
15328
15360
|
* @ngdoc provider
|
15329
15361
|
* @name $compileProvider
|
15330
|
-
* @function
|
15362
|
+
* @kind function
|
15331
15363
|
*
|
15332
15364
|
* @description
|
15333
15365
|
*/
|
@@ -15335,8 +15367,8 @@ $CompileProvider.$inject = ['$provide', '$$sanitizeUriProvider'];
|
|
15335
15367
|
function $CompileProvider($provide, $$sanitizeUriProvider) {
|
15336
15368
|
var hasDirectives = {},
|
15337
15369
|
Suffix = 'Directive',
|
15338
|
-
COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\
|
15339
|
-
CLASS_DIRECTIVE_REGEXP = /(([\d\
|
15370
|
+
COMMENT_DIRECTIVE_REGEXP = /^\s*directive\:\s*([\d\w_\-]+)\s+(.*)$/,
|
15371
|
+
CLASS_DIRECTIVE_REGEXP = /(([\d\w_\-]+)(?:\:([^;]+))?;?)/;
|
15340
15372
|
|
15341
15373
|
// Ref: http://developers.whatwg.org/webappapis.html#event-handler-idl-attributes
|
15342
15374
|
// The assumption is that future DOM event attribute names will begin with
|
@@ -15346,7 +15378,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15346
15378
|
/**
|
15347
15379
|
* @ngdoc method
|
15348
15380
|
* @name $compileProvider#directive
|
15349
|
-
* @function
|
15381
|
+
* @kind function
|
15350
15382
|
*
|
15351
15383
|
* @description
|
15352
15384
|
* Register a new directive with the compiler.
|
@@ -15399,7 +15431,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15399
15431
|
/**
|
15400
15432
|
* @ngdoc method
|
15401
15433
|
* @name $compileProvider#aHrefSanitizationWhitelist
|
15402
|
-
* @function
|
15434
|
+
* @kind function
|
15403
15435
|
*
|
15404
15436
|
* @description
|
15405
15437
|
* Retrieves or overrides the default regular expression that is used for whitelisting of safe
|
@@ -15429,7 +15461,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15429
15461
|
/**
|
15430
15462
|
* @ngdoc method
|
15431
15463
|
* @name $compileProvider#imgSrcSanitizationWhitelist
|
15432
|
-
* @function
|
15464
|
+
* @kind function
|
15433
15465
|
*
|
15434
15466
|
* @description
|
15435
15467
|
* Retrieves or overrides the default regular expression that is used for whitelisting of safe
|
@@ -15473,7 +15505,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15473
15505
|
/**
|
15474
15506
|
* @ngdoc method
|
15475
15507
|
* @name $compile.directive.Attributes#$addClass
|
15476
|
-
* @function
|
15508
|
+
* @kind function
|
15477
15509
|
*
|
15478
15510
|
* @description
|
15479
15511
|
* Adds the CSS class value specified by the classVal parameter to the element. If animations
|
@@ -15490,7 +15522,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15490
15522
|
/**
|
15491
15523
|
* @ngdoc method
|
15492
15524
|
* @name $compile.directive.Attributes#$removeClass
|
15493
|
-
* @function
|
15525
|
+
* @kind function
|
15494
15526
|
*
|
15495
15527
|
* @description
|
15496
15528
|
* Removes the CSS class value specified by the classVal parameter from the element. If
|
@@ -15507,7 +15539,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15507
15539
|
/**
|
15508
15540
|
* @ngdoc method
|
15509
15541
|
* @name $compile.directive.Attributes#$updateClass
|
15510
|
-
* @function
|
15542
|
+
* @kind function
|
15511
15543
|
*
|
15512
15544
|
* @description
|
15513
15545
|
* Adds and removes the appropriate CSS class values to the element based on the difference
|
@@ -15595,7 +15627,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15595
15627
|
/**
|
15596
15628
|
* @ngdoc method
|
15597
15629
|
* @name $compile.directive.Attributes#$observe
|
15598
|
-
* @function
|
15630
|
+
* @kind function
|
15599
15631
|
*
|
15600
15632
|
* @description
|
15601
15633
|
* Observes an interpolated attribute.
|
@@ -15658,7 +15690,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15658
15690
|
compileNodes($compileNodes, transcludeFn, $compileNodes,
|
15659
15691
|
maxPriority, ignoreDirective, previousCompileContext);
|
15660
15692
|
safeAddClass($compileNodes, 'ng-scope');
|
15661
|
-
return function publicLinkFn(scope, cloneConnectFn, transcludeControllers){
|
15693
|
+
return function publicLinkFn(scope, cloneConnectFn, transcludeControllers, parentBoundTranscludeFn){
|
15662
15694
|
assertArg(scope, 'scope');
|
15663
15695
|
// important!!: we must call our jqLite.clone() since the jQuery one is trying to be smart
|
15664
15696
|
// and sometimes changes the structure of the DOM.
|
@@ -15680,7 +15712,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15680
15712
|
}
|
15681
15713
|
|
15682
15714
|
if (cloneConnectFn) cloneConnectFn($linkNode, scope);
|
15683
|
-
if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode);
|
15715
|
+
if (compositeLinkFn) compositeLinkFn(scope, $linkNode, $linkNode, parentBoundTranscludeFn);
|
15684
15716
|
return $linkNode;
|
15685
15717
|
};
|
15686
15718
|
}
|
@@ -15735,7 +15767,9 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15735
15767
|
!childNodes.length)
|
15736
15768
|
? null
|
15737
15769
|
: compileNodes(childNodes,
|
15738
|
-
nodeLinkFn ?
|
15770
|
+
nodeLinkFn ? (
|
15771
|
+
(nodeLinkFn.transcludeOnThisElement || !nodeLinkFn.templateOnThisElement)
|
15772
|
+
&& nodeLinkFn.transclude) : transcludeFn);
|
15739
15773
|
|
15740
15774
|
linkFns.push(nodeLinkFn, childLinkFn);
|
15741
15775
|
linkFnFound = linkFnFound || nodeLinkFn || childLinkFn;
|
@@ -15746,8 +15780,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15746
15780
|
// return a linking function if we have found anything, null otherwise
|
15747
15781
|
return linkFnFound ? compositeLinkFn : null;
|
15748
15782
|
|
15749
|
-
function compositeLinkFn(scope, nodeList, $rootElement,
|
15750
|
-
var nodeLinkFn, childLinkFn, node, $node, childScope,
|
15783
|
+
function compositeLinkFn(scope, nodeList, $rootElement, parentBoundTranscludeFn) {
|
15784
|
+
var nodeLinkFn, childLinkFn, node, $node, childScope, i, ii, n, childBoundTranscludeFn;
|
15751
15785
|
|
15752
15786
|
// copy nodeList so that linking doesn't break due to live list updates.
|
15753
15787
|
var nodeListLength = nodeList.length,
|
@@ -15769,23 +15803,32 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15769
15803
|
} else {
|
15770
15804
|
childScope = scope;
|
15771
15805
|
}
|
15772
|
-
|
15773
|
-
if (
|
15774
|
-
|
15775
|
-
|
15776
|
-
|
15806
|
+
|
15807
|
+
if ( nodeLinkFn.transcludeOnThisElement ) {
|
15808
|
+
childBoundTranscludeFn = createBoundTranscludeFn(scope, nodeLinkFn.transclude, parentBoundTranscludeFn);
|
15809
|
+
|
15810
|
+
} else if (!nodeLinkFn.templateOnThisElement && parentBoundTranscludeFn) {
|
15811
|
+
childBoundTranscludeFn = parentBoundTranscludeFn;
|
15812
|
+
|
15813
|
+
} else if (!parentBoundTranscludeFn && transcludeFn) {
|
15814
|
+
childBoundTranscludeFn = createBoundTranscludeFn(scope, transcludeFn);
|
15815
|
+
|
15777
15816
|
} else {
|
15778
|
-
|
15817
|
+
childBoundTranscludeFn = null;
|
15779
15818
|
}
|
15819
|
+
|
15820
|
+
nodeLinkFn(childLinkFn, childScope, node, $rootElement, childBoundTranscludeFn);
|
15821
|
+
|
15780
15822
|
} else if (childLinkFn) {
|
15781
|
-
childLinkFn(scope, node.childNodes, undefined,
|
15823
|
+
childLinkFn(scope, node.childNodes, undefined, parentBoundTranscludeFn);
|
15782
15824
|
}
|
15783
15825
|
}
|
15784
15826
|
}
|
15785
15827
|
}
|
15786
15828
|
|
15787
|
-
function createBoundTranscludeFn(scope, transcludeFn) {
|
15788
|
-
|
15829
|
+
function createBoundTranscludeFn(scope, transcludeFn, previousBoundTranscludeFn) {
|
15830
|
+
|
15831
|
+
var boundTranscludeFn = function(transcludedScope, cloneFn, controllers) {
|
15789
15832
|
var scopeCreated = false;
|
15790
15833
|
|
15791
15834
|
if (!transcludedScope) {
|
@@ -15794,12 +15837,14 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15794
15837
|
scopeCreated = true;
|
15795
15838
|
}
|
15796
15839
|
|
15797
|
-
var clone = transcludeFn(transcludedScope, cloneFn, controllers);
|
15840
|
+
var clone = transcludeFn(transcludedScope, cloneFn, controllers, previousBoundTranscludeFn);
|
15798
15841
|
if (scopeCreated) {
|
15799
|
-
clone.on('$destroy',
|
15842
|
+
clone.on('$destroy', function() { transcludedScope.$destroy(); });
|
15800
15843
|
}
|
15801
15844
|
return clone;
|
15802
15845
|
};
|
15846
|
+
|
15847
|
+
return boundTranscludeFn;
|
15803
15848
|
}
|
15804
15849
|
|
15805
15850
|
/**
|
@@ -15977,6 +16022,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
15977
16022
|
templateDirective = previousCompileContext.templateDirective,
|
15978
16023
|
nonTlbTranscludeDirective = previousCompileContext.nonTlbTranscludeDirective,
|
15979
16024
|
hasTranscludeDirective = false,
|
16025
|
+
hasTemplate = false,
|
15980
16026
|
hasElementTranscludeDirective = previousCompileContext.hasElementTranscludeDirective,
|
15981
16027
|
$compileNode = templateAttrs.$$element = jqLite(compileNode),
|
15982
16028
|
directive,
|
@@ -16067,6 +16113,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16067
16113
|
}
|
16068
16114
|
|
16069
16115
|
if (directive.template) {
|
16116
|
+
hasTemplate = true;
|
16070
16117
|
assertNoDuplicate('template', templateDirective, directive, $compileNode);
|
16071
16118
|
templateDirective = directive;
|
16072
16119
|
|
@@ -16081,7 +16128,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16081
16128
|
if (jqLiteIsTextNode(directiveValue)) {
|
16082
16129
|
$template = [];
|
16083
16130
|
} else {
|
16084
|
-
$template = jqLite(directiveValue);
|
16131
|
+
$template = jqLite(trim(directiveValue));
|
16085
16132
|
}
|
16086
16133
|
compileNode = $template[0];
|
16087
16134
|
|
@@ -16116,6 +16163,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16116
16163
|
}
|
16117
16164
|
|
16118
16165
|
if (directive.templateUrl) {
|
16166
|
+
hasTemplate = true;
|
16119
16167
|
assertNoDuplicate('template', templateDirective, directive, $compileNode);
|
16120
16168
|
templateDirective = directive;
|
16121
16169
|
|
@@ -16124,7 +16172,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16124
16172
|
}
|
16125
16173
|
|
16126
16174
|
nodeLinkFn = compileTemplateUrl(directives.splice(i, directives.length - i), $compileNode,
|
16127
|
-
templateAttrs, jqCollection, childTranscludeFn, preLinkFns, postLinkFns, {
|
16175
|
+
templateAttrs, jqCollection, hasTranscludeDirective && childTranscludeFn, preLinkFns, postLinkFns, {
|
16128
16176
|
controllerDirectives: controllerDirectives,
|
16129
16177
|
newIsolateScopeDirective: newIsolateScopeDirective,
|
16130
16178
|
templateDirective: templateDirective,
|
@@ -16152,7 +16200,10 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16152
16200
|
}
|
16153
16201
|
|
16154
16202
|
nodeLinkFn.scope = newScopeDirective && newScopeDirective.scope === true;
|
16155
|
-
nodeLinkFn.
|
16203
|
+
nodeLinkFn.transcludeOnThisElement = hasTranscludeDirective;
|
16204
|
+
nodeLinkFn.templateOnThisElement = hasTemplate;
|
16205
|
+
nodeLinkFn.transclude = childTranscludeFn;
|
16206
|
+
|
16156
16207
|
previousCompileContext.hasElementTranscludeDirective = hasElementTranscludeDirective;
|
16157
16208
|
|
16158
16209
|
// might be normal or delayed nodeLinkFn depending on if templateUrl is present
|
@@ -16164,6 +16215,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16164
16215
|
if (pre) {
|
16165
16216
|
if (attrStart) pre = groupElementsLinkFnWrapper(pre, attrStart, attrEnd);
|
16166
16217
|
pre.require = directive.require;
|
16218
|
+
pre.directiveName = directiveName;
|
16167
16219
|
if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
|
16168
16220
|
pre = cloneAndAnnotateFn(pre, {isolateScope: true});
|
16169
16221
|
}
|
@@ -16172,6 +16224,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16172
16224
|
if (post) {
|
16173
16225
|
if (attrStart) post = groupElementsLinkFnWrapper(post, attrStart, attrEnd);
|
16174
16226
|
post.require = directive.require;
|
16227
|
+
post.directiveName = directiveName;
|
16175
16228
|
if (newIsolateScopeDirective === directive || directive.$$isolateScope) {
|
16176
16229
|
post = cloneAndAnnotateFn(post, {isolateScope: true});
|
16177
16230
|
}
|
@@ -16180,7 +16233,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16180
16233
|
}
|
16181
16234
|
|
16182
16235
|
|
16183
|
-
function getControllers(require, $element, elementControllers) {
|
16236
|
+
function getControllers(directiveName, require, $element, elementControllers) {
|
16184
16237
|
var value, retrievalMethod = 'data', optional = false;
|
16185
16238
|
if (isString(require)) {
|
16186
16239
|
while((value = require.charAt(0)) == '^' || value == '?') {
|
@@ -16206,7 +16259,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16206
16259
|
} else if (isArray(require)) {
|
16207
16260
|
value = [];
|
16208
16261
|
forEach(require, function(require) {
|
16209
|
-
value.push(getControllers(require, $element, elementControllers));
|
16262
|
+
value.push(getControllers(directiveName, require, $element, elementControllers));
|
16210
16263
|
});
|
16211
16264
|
}
|
16212
16265
|
return value;
|
@@ -16229,7 +16282,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16229
16282
|
|
16230
16283
|
isolateScope = scope.$new(true);
|
16231
16284
|
|
16232
|
-
if (templateDirective && (templateDirective === newIsolateScopeDirective
|
16285
|
+
if (templateDirective && (templateDirective === newIsolateScopeDirective ||
|
16286
|
+
templateDirective === newIsolateScopeDirective.$$originalDirective)) {
|
16233
16287
|
$linkNode.data('$isolateScope', isolateScope) ;
|
16234
16288
|
} else {
|
16235
16289
|
$linkNode.data('$isolateScopeNoTemplate', isolateScope);
|
@@ -16349,7 +16403,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16349
16403
|
try {
|
16350
16404
|
linkFn = preLinkFns[i];
|
16351
16405
|
linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,
|
16352
|
-
linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
|
16406
|
+
linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);
|
16353
16407
|
} catch (e) {
|
16354
16408
|
$exceptionHandler(e, startingTag($element));
|
16355
16409
|
}
|
@@ -16369,7 +16423,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16369
16423
|
try {
|
16370
16424
|
linkFn = postLinkFns[i];
|
16371
16425
|
linkFn(linkFn.isolateScope ? isolateScope : scope, $element, attrs,
|
16372
|
-
linkFn.require && getControllers(linkFn.require, $element, elementControllers), transcludeFn);
|
16426
|
+
linkFn.require && getControllers(linkFn.directiveName, linkFn.require, $element, elementControllers), transcludeFn);
|
16373
16427
|
} catch (e) {
|
16374
16428
|
$exceptionHandler(e, startingTag($element));
|
16375
16429
|
}
|
@@ -16455,7 +16509,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16455
16509
|
// reapply the old attributes to the new element
|
16456
16510
|
forEach(dst, function(value, key) {
|
16457
16511
|
if (key.charAt(0) != '$') {
|
16458
|
-
if (src[key]) {
|
16512
|
+
if (src[key] && src[key] !== value) {
|
16459
16513
|
value += (key === 'style' ? ';' : ' ') + src[key];
|
16460
16514
|
}
|
16461
16515
|
dst.$set(key, value, true, srcAttr[key]);
|
@@ -16508,7 +16562,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16508
16562
|
if (jqLiteIsTextNode(content)) {
|
16509
16563
|
$template = [];
|
16510
16564
|
} else {
|
16511
|
-
$template = jqLite(content);
|
16565
|
+
$template = jqLite(trim(content));
|
16512
16566
|
}
|
16513
16567
|
compileNode = $template[0];
|
16514
16568
|
|
@@ -16544,7 +16598,6 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16544
16598
|
});
|
16545
16599
|
afterTemplateChildLinkFn = compileNodes($compileNode[0].childNodes, childTranscludeFn);
|
16546
16600
|
|
16547
|
-
|
16548
16601
|
while(linkQueue.length) {
|
16549
16602
|
var scope = linkQueue.shift(),
|
16550
16603
|
beforeTemplateLinkNode = linkQueue.shift(),
|
@@ -16566,8 +16619,8 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16566
16619
|
// Copy in CSS classes from original node
|
16567
16620
|
safeAddClass(jqLite(linkNode), oldClasses);
|
16568
16621
|
}
|
16569
|
-
if (afterTemplateNodeLinkFn.
|
16570
|
-
childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude);
|
16622
|
+
if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
|
16623
|
+
childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
|
16571
16624
|
} else {
|
16572
16625
|
childBoundTranscludeFn = boundTranscludeFn;
|
16573
16626
|
}
|
@@ -16581,13 +16634,17 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16581
16634
|
});
|
16582
16635
|
|
16583
16636
|
return function delayedNodeLinkFn(ignoreChildLinkFn, scope, node, rootElement, boundTranscludeFn) {
|
16637
|
+
var childBoundTranscludeFn = boundTranscludeFn;
|
16584
16638
|
if (linkQueue) {
|
16585
16639
|
linkQueue.push(scope);
|
16586
16640
|
linkQueue.push(node);
|
16587
16641
|
linkQueue.push(rootElement);
|
16588
|
-
linkQueue.push(
|
16642
|
+
linkQueue.push(childBoundTranscludeFn);
|
16589
16643
|
} else {
|
16590
|
-
afterTemplateNodeLinkFn
|
16644
|
+
if (afterTemplateNodeLinkFn.transcludeOnThisElement) {
|
16645
|
+
childBoundTranscludeFn = createBoundTranscludeFn(scope, afterTemplateNodeLinkFn.transclude, boundTranscludeFn);
|
16646
|
+
}
|
16647
|
+
afterTemplateNodeLinkFn(afterTemplateChildLinkFn, scope, node, rootElement, childBoundTranscludeFn);
|
16591
16648
|
}
|
16592
16649
|
};
|
16593
16650
|
}
|
@@ -16612,23 +16669,31 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
16612
16669
|
}
|
16613
16670
|
|
16614
16671
|
|
16615
|
-
|
16616
|
-
|
16617
|
-
|
16618
|
-
|
16619
|
-
|
16620
|
-
|
16621
|
-
|
16622
|
-
|
16623
|
-
|
16624
|
-
|
16625
|
-
|
16626
|
-
node
|
16627
|
-
|
16628
|
-
|
16629
|
-
|
16672
|
+
function addTextInterpolateDirective(directives, text) {
|
16673
|
+
var interpolateFn = $interpolate(text, true);
|
16674
|
+
if (interpolateFn) {
|
16675
|
+
directives.push({
|
16676
|
+
priority: 0,
|
16677
|
+
compile: function textInterpolateCompileFn(templateNode) {
|
16678
|
+
// when transcluding a template that has bindings in the root
|
16679
|
+
// then we don't have a parent and should do this in the linkFn
|
16680
|
+
var parent = templateNode.parent(), hasCompileParent = parent.length;
|
16681
|
+
if (hasCompileParent) safeAddClass(templateNode.parent(), 'ng-binding');
|
16682
|
+
|
16683
|
+
return function textInterpolateLinkFn(scope, node) {
|
16684
|
+
var parent = node.parent(),
|
16685
|
+
bindings = parent.data('$binding') || [];
|
16686
|
+
bindings.push(interpolateFn);
|
16687
|
+
parent.data('$binding', bindings);
|
16688
|
+
if (!hasCompileParent) safeAddClass(parent, 'ng-binding');
|
16689
|
+
scope.$watch(interpolateFn, function interpolateFnWatchAction(value) {
|
16690
|
+
node[0].nodeValue = value;
|
16691
|
+
});
|
16692
|
+
};
|
16693
|
+
}
|
16694
|
+
});
|
16695
|
+
}
|
16630
16696
|
}
|
16631
|
-
}
|
16632
16697
|
|
16633
16698
|
|
16634
16699
|
function getTrustedContext(node, attrNormalizedName) {
|
@@ -16789,7 +16854,9 @@ function directiveNormalize(name) {
|
|
16789
16854
|
* element attributes. The values reflect current binding state `{{ }}`. The normalization is
|
16790
16855
|
* needed since all of these are treated as equivalent in Angular:
|
16791
16856
|
*
|
16857
|
+
* ```
|
16792
16858
|
* <span ng:bind="a" ng-bind="a" data-ng-bind="a" x-ng-bind="a">
|
16859
|
+
* ```
|
16793
16860
|
*/
|
16794
16861
|
|
16795
16862
|
/**
|
@@ -16803,7 +16870,7 @@ function directiveNormalize(name) {
|
|
16803
16870
|
/**
|
16804
16871
|
* @ngdoc method
|
16805
16872
|
* @name $compile.directive.Attributes#$set
|
16806
|
-
* @function
|
16873
|
+
* @kind function
|
16807
16874
|
*
|
16808
16875
|
* @description
|
16809
16876
|
* Set DOM element attribute value.
|
@@ -17121,9 +17188,9 @@ function $HttpProvider() {
|
|
17121
17188
|
common: {
|
17122
17189
|
'Accept': 'application/json, text/plain, */*'
|
17123
17190
|
},
|
17124
|
-
post:
|
17125
|
-
put:
|
17126
|
-
patch:
|
17191
|
+
post: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
|
17192
|
+
put: shallowCopy(CONTENT_TYPE_APPLICATION_JSON),
|
17193
|
+
patch: shallowCopy(CONTENT_TYPE_APPLICATION_JSON)
|
17127
17194
|
},
|
17128
17195
|
|
17129
17196
|
xsrfCookieName: 'XSRF-TOKEN',
|
@@ -17365,14 +17432,14 @@ function $HttpProvider() {
|
|
17365
17432
|
*
|
17366
17433
|
* There are two kinds of interceptors (and two kinds of rejection interceptors):
|
17367
17434
|
*
|
17368
|
-
* * `request`: interceptors get called with http `config` object. The function is free to
|
17369
|
-
* modify the `config` or create a new one. The function needs to return the `config`
|
17370
|
-
* directly or
|
17435
|
+
* * `request`: interceptors get called with a http `config` object. The function is free to
|
17436
|
+
* modify the `config` object or create a new one. The function needs to return the `config`
|
17437
|
+
* object directly, or a promise containing the `config` or a new `config` object.
|
17371
17438
|
* * `requestError`: interceptor gets called when a previous interceptor threw an error or
|
17372
17439
|
* resolved with a rejection.
|
17373
17440
|
* * `response`: interceptors get called with http `response` object. The function is free to
|
17374
|
-
* modify the `response` or create a new one. The function needs to return the `response`
|
17375
|
-
* directly or as a promise.
|
17441
|
+
* modify the `response` object or create a new one. The function needs to return the `response`
|
17442
|
+
* object directly, or as a promise containing the `response` or a new `response` object.
|
17376
17443
|
* * `responseError`: interceptor gets called when a previous interceptor threw an error or
|
17377
17444
|
* resolved with a rejection.
|
17378
17445
|
*
|
@@ -17384,7 +17451,7 @@ function $HttpProvider() {
|
|
17384
17451
|
* // optional method
|
17385
17452
|
* 'request': function(config) {
|
17386
17453
|
* // do something on success
|
17387
|
-
* return config
|
17454
|
+
* return config;
|
17388
17455
|
* },
|
17389
17456
|
*
|
17390
17457
|
* // optional method
|
@@ -17401,7 +17468,7 @@ function $HttpProvider() {
|
|
17401
17468
|
* // optional method
|
17402
17469
|
* 'response': function(response) {
|
17403
17470
|
* // do something on success
|
17404
|
-
* return response
|
17471
|
+
* return response;
|
17405
17472
|
* },
|
17406
17473
|
*
|
17407
17474
|
* // optional method
|
@@ -17562,7 +17629,7 @@ function $HttpProvider() {
|
|
17562
17629
|
* caching.
|
17563
17630
|
* - **timeout** – `{number|Promise}` – timeout in milliseconds, or {@link ng.$q promise}
|
17564
17631
|
* that should abort the request when resolved.
|
17565
|
-
* - **withCredentials** - `{boolean}` - whether to
|
17632
|
+
* - **withCredentials** - `{boolean}` - whether to set the `withCredentials` flag on the
|
17566
17633
|
* XHR object. See [requests with credentials]https://developer.mozilla.org/en/http_access_control#section_5
|
17567
17634
|
* for more information.
|
17568
17635
|
* - **responseType** - `{string}` - see
|
@@ -17600,11 +17667,11 @@ function $HttpProvider() {
|
|
17600
17667
|
<button id="samplegetbtn" ng-click="updateModel('GET', 'http-hello.html')">Sample GET</button>
|
17601
17668
|
<button id="samplejsonpbtn"
|
17602
17669
|
ng-click="updateModel('JSONP',
|
17603
|
-
'
|
17670
|
+
'https://angularjs.org/greet.php?callback=JSON_CALLBACK&name=Super%20Hero')">
|
17604
17671
|
Sample JSONP
|
17605
17672
|
</button>
|
17606
17673
|
<button id="invalidjsonpbtn"
|
17607
|
-
ng-click="updateModel('JSONP', '
|
17674
|
+
ng-click="updateModel('JSONP', 'https://angularjs.org/doesntexist&callback=JSON_CALLBACK')">
|
17608
17675
|
Invalid JSONP
|
17609
17676
|
</button>
|
17610
17677
|
<pre>http status code: {{status}}</pre>
|
@@ -17684,14 +17751,6 @@ function $HttpProvider() {
|
|
17684
17751
|
config.headers = headers;
|
17685
17752
|
config.method = uppercase(config.method);
|
17686
17753
|
|
17687
|
-
var xsrfValue = urlIsSameOrigin(config.url)
|
17688
|
-
? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
|
17689
|
-
: undefined;
|
17690
|
-
if (xsrfValue) {
|
17691
|
-
headers[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
|
17692
|
-
}
|
17693
|
-
|
17694
|
-
|
17695
17754
|
var serverRequest = function(config) {
|
17696
17755
|
headers = config.headers;
|
17697
17756
|
var reqData = transformData(config.data, headersGetter(headers), config.transformRequest);
|
@@ -17956,7 +18015,7 @@ function $HttpProvider() {
|
|
17956
18015
|
} else {
|
17957
18016
|
// serving from cache
|
17958
18017
|
if (isArray(cachedResp)) {
|
17959
|
-
resolvePromise(cachedResp[1], cachedResp[0],
|
18018
|
+
resolvePromise(cachedResp[1], cachedResp[0], shallowCopy(cachedResp[2]), cachedResp[3]);
|
17960
18019
|
} else {
|
17961
18020
|
resolvePromise(cachedResp, 200, {}, 'OK');
|
17962
18021
|
}
|
@@ -17967,8 +18026,17 @@ function $HttpProvider() {
|
|
17967
18026
|
}
|
17968
18027
|
}
|
17969
18028
|
|
17970
|
-
|
18029
|
+
|
18030
|
+
// if we won't have the response in cache, set the xsrf headers and
|
18031
|
+
// send the request to the backend
|
17971
18032
|
if (isUndefined(cachedResp)) {
|
18033
|
+
var xsrfValue = urlIsSameOrigin(config.url)
|
18034
|
+
? $browser.cookies()[config.xsrfCookieName || defaults.xsrfCookieName]
|
18035
|
+
: undefined;
|
18036
|
+
if (xsrfValue) {
|
18037
|
+
reqHeaders[(config.xsrfHeaderName || defaults.xsrfHeaderName)] = xsrfValue;
|
18038
|
+
}
|
18039
|
+
|
17972
18040
|
$httpBackend(config.method, url, reqData, done, reqHeaders, config.timeout,
|
17973
18041
|
config.withCredentials, config.responseType);
|
17974
18042
|
}
|
@@ -18095,16 +18163,13 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18095
18163
|
var callbackId = '_' + (callbacks.counter++).toString(36);
|
18096
18164
|
callbacks[callbackId] = function(data) {
|
18097
18165
|
callbacks[callbackId].data = data;
|
18166
|
+
callbacks[callbackId].called = true;
|
18098
18167
|
};
|
18099
18168
|
|
18100
18169
|
var jsonpDone = jsonpReq(url.replace('JSON_CALLBACK', 'angular.callbacks.' + callbackId),
|
18101
|
-
function() {
|
18102
|
-
|
18103
|
-
|
18104
|
-
} else {
|
18105
|
-
completeRequest(callback, status || -2);
|
18106
|
-
}
|
18107
|
-
callbacks[callbackId] = angular.noop;
|
18170
|
+
callbackId, function(status, text) {
|
18171
|
+
completeRequest(callback, status, callbacks[callbackId].data, "", text);
|
18172
|
+
callbacks[callbackId] = noop;
|
18108
18173
|
});
|
18109
18174
|
} else {
|
18110
18175
|
|
@@ -18206,34 +18271,52 @@ function createHttpBackend($browser, createXhr, $browserDefer, callbacks, rawDoc
|
|
18206
18271
|
}
|
18207
18272
|
};
|
18208
18273
|
|
18209
|
-
function jsonpReq(url, done) {
|
18274
|
+
function jsonpReq(url, callbackId, done) {
|
18210
18275
|
// we can't use jQuery/jqLite here because jQuery does crazy shit with script elements, e.g.:
|
18211
18276
|
// - fetches local scripts via XHR and evals them
|
18212
18277
|
// - adds and immediately removes script elements from the document
|
18213
|
-
var script = rawDocument.createElement('script'),
|
18214
|
-
|
18215
|
-
script.onreadystatechange = script.onload = script.onerror = null;
|
18216
|
-
rawDocument.body.removeChild(script);
|
18217
|
-
if (done) done();
|
18218
|
-
};
|
18219
|
-
|
18220
|
-
script.type = 'text/javascript';
|
18278
|
+
var script = rawDocument.createElement('script'), callback = null;
|
18279
|
+
script.type = "text/javascript";
|
18221
18280
|
script.src = url;
|
18281
|
+
script.async = true;
|
18282
|
+
|
18283
|
+
callback = function(event) {
|
18284
|
+
removeEventListenerFn(script, "load", callback);
|
18285
|
+
removeEventListenerFn(script, "error", callback);
|
18286
|
+
rawDocument.body.removeChild(script);
|
18287
|
+
script = null;
|
18288
|
+
var status = -1;
|
18289
|
+
var text = "unknown";
|
18290
|
+
|
18291
|
+
if (event) {
|
18292
|
+
if (event.type === "load" && !callbacks[callbackId].called) {
|
18293
|
+
event = { type: "error" };
|
18294
|
+
}
|
18295
|
+
text = event.type;
|
18296
|
+
status = event.type === "error" ? 404 : 200;
|
18297
|
+
}
|
18298
|
+
|
18299
|
+
if (done) {
|
18300
|
+
done(status, text);
|
18301
|
+
}
|
18302
|
+
};
|
18303
|
+
|
18304
|
+
addEventListenerFn(script, "load", callback);
|
18305
|
+
addEventListenerFn(script, "error", callback);
|
18222
18306
|
|
18223
|
-
if (msie
|
18307
|
+
if (msie <= 8) {
|
18224
18308
|
script.onreadystatechange = function() {
|
18225
|
-
if (/loaded|complete/.test(script.readyState)) {
|
18226
|
-
|
18309
|
+
if (isString(script.readyState) && /loaded|complete/.test(script.readyState)) {
|
18310
|
+
script.onreadystatechange = null;
|
18311
|
+
callback({
|
18312
|
+
type: 'load'
|
18313
|
+
});
|
18227
18314
|
}
|
18228
18315
|
};
|
18229
|
-
} else {
|
18230
|
-
script.onload = script.onerror = function() {
|
18231
|
-
doneWrapper();
|
18232
|
-
};
|
18233
18316
|
}
|
18234
18317
|
|
18235
18318
|
rawDocument.body.appendChild(script);
|
18236
|
-
return
|
18319
|
+
return callback;
|
18237
18320
|
}
|
18238
18321
|
}
|
18239
18322
|
|
@@ -18242,7 +18325,7 @@ var $interpolateMinErr = minErr('$interpolate');
|
|
18242
18325
|
/**
|
18243
18326
|
* @ngdoc provider
|
18244
18327
|
* @name $interpolateProvider
|
18245
|
-
* @function
|
18328
|
+
* @kind function
|
18246
18329
|
*
|
18247
18330
|
* @description
|
18248
18331
|
*
|
@@ -18260,7 +18343,7 @@ var $interpolateMinErr = minErr('$interpolate');
|
|
18260
18343
|
});
|
18261
18344
|
|
18262
18345
|
|
18263
|
-
customInterpolationApp.controller('DemoController', function
|
18346
|
+
customInterpolationApp.controller('DemoController', function() {
|
18264
18347
|
this.label = "This binding is brought you by // interpolation symbols.";
|
18265
18348
|
});
|
18266
18349
|
</script>
|
@@ -18323,7 +18406,7 @@ function $InterpolateProvider() {
|
|
18323
18406
|
/**
|
18324
18407
|
* @ngdoc service
|
18325
18408
|
* @name $interpolate
|
18326
|
-
* @function
|
18409
|
+
* @kind function
|
18327
18410
|
*
|
18328
18411
|
* @requires $parse
|
18329
18412
|
* @requires $sce
|
@@ -18415,10 +18498,24 @@ function $InterpolateProvider() {
|
|
18415
18498
|
} else {
|
18416
18499
|
part = $sce.valueOf(part);
|
18417
18500
|
}
|
18418
|
-
if (part
|
18501
|
+
if (part == null) { // null || undefined
|
18419
18502
|
part = '';
|
18420
|
-
} else
|
18421
|
-
|
18503
|
+
} else {
|
18504
|
+
switch (typeof part) {
|
18505
|
+
case 'string':
|
18506
|
+
{
|
18507
|
+
break;
|
18508
|
+
}
|
18509
|
+
case 'number':
|
18510
|
+
{
|
18511
|
+
part = '' + part;
|
18512
|
+
break;
|
18513
|
+
}
|
18514
|
+
default:
|
18515
|
+
{
|
18516
|
+
part = toJson(part);
|
18517
|
+
}
|
18518
|
+
}
|
18422
18519
|
}
|
18423
18520
|
}
|
18424
18521
|
concat[i] = part;
|
@@ -18929,7 +19026,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
18929
19026
|
Matches paths for file protocol on windows,
|
18930
19027
|
such as /C:/foo/bar, and captures only /foo/bar.
|
18931
19028
|
*/
|
18932
|
-
var windowsFilePathExp =
|
19029
|
+
var windowsFilePathExp = /^\/[A-Z]:(\/.*)/;
|
18933
19030
|
|
18934
19031
|
var firstPathSegmentMatch;
|
18935
19032
|
|
@@ -18938,10 +19035,7 @@ function LocationHashbangUrl(appBase, hashPrefix) {
|
|
18938
19035
|
url = url.replace(base, '');
|
18939
19036
|
}
|
18940
19037
|
|
18941
|
-
|
18942
|
-
* The input URL intentionally contains a
|
18943
|
-
* first path segment that ends with a colon.
|
18944
|
-
*/
|
19038
|
+
// The input URL intentionally contains a first path segment that ends with a colon.
|
18945
19039
|
if (windowsFilePathExp.exec(url)) {
|
18946
19040
|
return path;
|
18947
19041
|
}
|
@@ -18997,6 +19091,16 @@ function LocationHashbangInHtml5Url(appBase, hashPrefix) {
|
|
18997
19091
|
return appBaseNoFile;
|
18998
19092
|
}
|
18999
19093
|
};
|
19094
|
+
|
19095
|
+
this.$$compose = function() {
|
19096
|
+
var search = toKeyValue(this.$$search),
|
19097
|
+
hash = this.$$hash ? '#' + encodeUriSegment(this.$$hash) : '';
|
19098
|
+
|
19099
|
+
this.$$url = encodePath(this.$$path) + (search ? '?' + search : '') + hash;
|
19100
|
+
// include hashPrefix in $$absUrl when $$url is empty so IE8 & 9 do not reload page because of removal of '#'
|
19101
|
+
this.$$absUrl = appBase + hashPrefix + this.$$url;
|
19102
|
+
};
|
19103
|
+
|
19000
19104
|
}
|
19001
19105
|
|
19002
19106
|
|
@@ -19128,15 +19232,37 @@ LocationHashbangInHtml5Url.prototype =
|
|
19128
19232
|
*
|
19129
19233
|
* Change search part when called with parameter and return `$location`.
|
19130
19234
|
*
|
19235
|
+
*
|
19236
|
+
* ```js
|
19237
|
+
* // given url http://example.com/#/some/path?foo=bar&baz=xoxo
|
19238
|
+
* var searchObject = $location.search();
|
19239
|
+
* // => {foo: 'bar', baz: 'xoxo'}
|
19240
|
+
*
|
19241
|
+
*
|
19242
|
+
* // set foo to 'yipee'
|
19243
|
+
* $location.search('foo', 'yipee');
|
19244
|
+
* // => $location
|
19245
|
+
* ```
|
19246
|
+
*
|
19131
19247
|
* @param {string|Object.<string>|Object.<Array.<string>>} search New search params - string or
|
19132
|
-
* hash object.
|
19133
|
-
*
|
19248
|
+
* hash object.
|
19249
|
+
*
|
19250
|
+
* When called with a single argument the method acts as a setter, setting the `search` component
|
19251
|
+
* of `$location` to the specified value.
|
19252
|
+
*
|
19253
|
+
* If the argument is a hash object containing an array of values, these values will be encoded
|
19254
|
+
* as duplicate search parameters in the url.
|
19134
19255
|
*
|
19135
|
-
* @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will
|
19136
|
-
* single search
|
19137
|
-
* comma-separated value. If `paramValue` is `null`, the parameter will be deleted.
|
19256
|
+
* @param {(string|Array<string>)=} paramValue If `search` is a string, then `paramValue` will
|
19257
|
+
* override only a single search property.
|
19138
19258
|
*
|
19139
|
-
*
|
19259
|
+
* If `paramValue` is an array, it will override the property of the `search` component of
|
19260
|
+
* `$location` specified via the first argument.
|
19261
|
+
*
|
19262
|
+
* If `paramValue` is `null`, the property specified via the first argument will be deleted.
|
19263
|
+
*
|
19264
|
+
* @return {Object} If called with no arguments returns the parsed `search` object. If called with
|
19265
|
+
* one or more arguments returns `$location` object itself.
|
19140
19266
|
*/
|
19141
19267
|
search: function(search, paramValue) {
|
19142
19268
|
switch (arguments.length) {
|
@@ -19349,6 +19475,39 @@ function $LocationProvider(){
|
|
19349
19475
|
absHref = urlResolve(absHref.animVal).href;
|
19350
19476
|
}
|
19351
19477
|
|
19478
|
+
// Make relative links work in HTML5 mode for legacy browsers (or at least IE8 & 9)
|
19479
|
+
// The href should be a regular url e.g. /link/somewhere or link/somewhere or ../somewhere or
|
19480
|
+
// somewhere#anchor or http://example.com/somewhere
|
19481
|
+
if (LocationMode === LocationHashbangInHtml5Url) {
|
19482
|
+
// get the actual href attribute - see
|
19483
|
+
// http://msdn.microsoft.com/en-us/library/ie/dd347148(v=vs.85).aspx
|
19484
|
+
var href = elm.attr('href') || elm.attr('xlink:href');
|
19485
|
+
|
19486
|
+
if (href.indexOf('://') < 0) { // Ignore absolute URLs
|
19487
|
+
var prefix = '#' + hashPrefix;
|
19488
|
+
if (href[0] == '/') {
|
19489
|
+
// absolute path - replace old path
|
19490
|
+
absHref = appBase + prefix + href;
|
19491
|
+
} else if (href[0] == '#') {
|
19492
|
+
// local anchor
|
19493
|
+
absHref = appBase + prefix + ($location.path() || '/') + href;
|
19494
|
+
} else {
|
19495
|
+
// relative path - join with current path
|
19496
|
+
var stack = $location.path().split("/"),
|
19497
|
+
parts = href.split("/");
|
19498
|
+
for (var i=0; i<parts.length; i++) {
|
19499
|
+
if (parts[i] == ".")
|
19500
|
+
continue;
|
19501
|
+
else if (parts[i] == "..")
|
19502
|
+
stack.pop();
|
19503
|
+
else if (parts[i].length)
|
19504
|
+
stack.push(parts[i]);
|
19505
|
+
}
|
19506
|
+
absHref = appBase + prefix + stack.join('/');
|
19507
|
+
}
|
19508
|
+
}
|
19509
|
+
}
|
19510
|
+
|
19352
19511
|
var rewrittenUrl = $location.$$rewrite(absHref);
|
19353
19512
|
|
19354
19513
|
if (absHref && !elm.attr('target') && rewrittenUrl && !event.isDefaultPrevented()) {
|
@@ -19709,9 +19868,6 @@ Lexer.prototype = {
|
|
19709
19868
|
|
19710
19869
|
this.tokens = [];
|
19711
19870
|
|
19712
|
-
var token;
|
19713
|
-
var json = [];
|
19714
|
-
|
19715
19871
|
while (this.index < this.text.length) {
|
19716
19872
|
this.ch = this.text.charAt(this.index);
|
19717
19873
|
if (this.is('"\'')) {
|
@@ -19720,19 +19876,11 @@ Lexer.prototype = {
|
|
19720
19876
|
this.readNumber();
|
19721
19877
|
} else if (this.isIdent(this.ch)) {
|
19722
19878
|
this.readIdent();
|
19723
|
-
// identifiers can only be if the preceding char was a { or ,
|
19724
|
-
if (this.was('{,') && json[0] === '{' &&
|
19725
|
-
(token = this.tokens[this.tokens.length - 1])) {
|
19726
|
-
token.json = token.text.indexOf('.') === -1;
|
19727
|
-
}
|
19728
19879
|
} else if (this.is('(){}[].,;:?')) {
|
19729
19880
|
this.tokens.push({
|
19730
19881
|
index: this.index,
|
19731
|
-
text: this.ch
|
19732
|
-
json: (this.was(':[,') && this.is('{[')) || this.is('}]:,')
|
19882
|
+
text: this.ch
|
19733
19883
|
});
|
19734
|
-
if (this.is('{[')) json.unshift(this.ch);
|
19735
|
-
if (this.is('}]')) json.shift();
|
19736
19884
|
this.index++;
|
19737
19885
|
} else if (this.isWhitespace(this.ch)) {
|
19738
19886
|
this.index++;
|
@@ -19753,8 +19901,7 @@ Lexer.prototype = {
|
|
19753
19901
|
this.tokens.push({
|
19754
19902
|
index: this.index,
|
19755
19903
|
text: this.ch,
|
19756
|
-
fn: fn
|
19757
|
-
json: (this.was('[,:') && this.is('+-'))
|
19904
|
+
fn: fn
|
19758
19905
|
});
|
19759
19906
|
this.index += 1;
|
19760
19907
|
} else {
|
@@ -19837,7 +19984,8 @@ Lexer.prototype = {
|
|
19837
19984
|
this.tokens.push({
|
19838
19985
|
index: start,
|
19839
19986
|
text: number,
|
19840
|
-
|
19987
|
+
literal: true,
|
19988
|
+
constant: true,
|
19841
19989
|
fn: function() { return number; }
|
19842
19990
|
});
|
19843
19991
|
},
|
@@ -19889,7 +20037,8 @@ Lexer.prototype = {
|
|
19889
20037
|
// OPERATORS is our own object so we don't need to use special hasOwnPropertyFn
|
19890
20038
|
if (OPERATORS.hasOwnProperty(ident)) {
|
19891
20039
|
token.fn = OPERATORS[ident];
|
19892
|
-
token.
|
20040
|
+
token.literal = true;
|
20041
|
+
token.constant = true;
|
19893
20042
|
} else {
|
19894
20043
|
var getter = getterFn(ident, this.options, this.text);
|
19895
20044
|
token.fn = extend(function(self, locals) {
|
@@ -19906,13 +20055,11 @@ Lexer.prototype = {
|
|
19906
20055
|
if (methodName) {
|
19907
20056
|
this.tokens.push({
|
19908
20057
|
index:lastDot,
|
19909
|
-
text: '.'
|
19910
|
-
json: false
|
20058
|
+
text: '.'
|
19911
20059
|
});
|
19912
20060
|
this.tokens.push({
|
19913
20061
|
index: lastDot + 1,
|
19914
|
-
text: methodName
|
19915
|
-
json: false
|
20062
|
+
text: methodName
|
19916
20063
|
});
|
19917
20064
|
}
|
19918
20065
|
},
|
@@ -19950,7 +20097,8 @@ Lexer.prototype = {
|
|
19950
20097
|
index: start,
|
19951
20098
|
text: rawString,
|
19952
20099
|
string: string,
|
19953
|
-
|
20100
|
+
literal: true,
|
20101
|
+
constant: true,
|
19954
20102
|
fn: function() { return string; }
|
19955
20103
|
});
|
19956
20104
|
return;
|
@@ -19982,28 +20130,12 @@ Parser.ZERO = extend(function () {
|
|
19982
20130
|
Parser.prototype = {
|
19983
20131
|
constructor: Parser,
|
19984
20132
|
|
19985
|
-
parse: function (text
|
20133
|
+
parse: function (text) {
|
19986
20134
|
this.text = text;
|
19987
20135
|
|
19988
|
-
//TODO(i): strip all the obsolte json stuff from this file
|
19989
|
-
this.json = json;
|
19990
|
-
|
19991
20136
|
this.tokens = this.lexer.lex(text);
|
19992
20137
|
|
19993
|
-
|
19994
|
-
// The extra level of aliasing is here, just in case the lexer misses something, so that
|
19995
|
-
// we prevent any accidental execution in JSON.
|
19996
|
-
this.assignment = this.logicalOR;
|
19997
|
-
|
19998
|
-
this.functionCall =
|
19999
|
-
this.fieldAccess =
|
20000
|
-
this.objectIndex =
|
20001
|
-
this.filterChain = function() {
|
20002
|
-
this.throwError('is not valid json', {text: text, index: 0});
|
20003
|
-
};
|
20004
|
-
}
|
20005
|
-
|
20006
|
-
var value = json ? this.primary() : this.statements();
|
20138
|
+
var value = this.statements();
|
20007
20139
|
|
20008
20140
|
if (this.tokens.length !== 0) {
|
20009
20141
|
this.throwError('is an unexpected token', this.tokens[0]);
|
@@ -20030,10 +20162,8 @@ Parser.prototype = {
|
|
20030
20162
|
if (!primary) {
|
20031
20163
|
this.throwError('not a primary expression', token);
|
20032
20164
|
}
|
20033
|
-
|
20034
|
-
|
20035
|
-
primary.literal = true;
|
20036
|
-
}
|
20165
|
+
primary.literal = !!token.literal;
|
20166
|
+
primary.constant = !!token.constant;
|
20037
20167
|
}
|
20038
20168
|
|
20039
20169
|
var next, context;
|
@@ -20081,9 +20211,6 @@ Parser.prototype = {
|
|
20081
20211
|
expect: function(e1, e2, e3, e4){
|
20082
20212
|
var token = this.peek(e1, e2, e3, e4);
|
20083
20213
|
if (token) {
|
20084
|
-
if (this.json && !token.json) {
|
20085
|
-
this.throwError('is not valid json', token);
|
20086
|
-
}
|
20087
20214
|
this.tokens.shift();
|
20088
20215
|
return token;
|
20089
20216
|
}
|
@@ -20718,7 +20845,7 @@ function getterFn(path, options, fullExp) {
|
|
20718
20845
|
/**
|
20719
20846
|
* @ngdoc provider
|
20720
20847
|
* @name $parseProvider
|
20721
|
-
* @function
|
20848
|
+
* @kind function
|
20722
20849
|
*
|
20723
20850
|
* @description
|
20724
20851
|
* `$parseProvider` can be used for configuring the default behavior of the {@link ng.$parse $parse}
|
@@ -20837,7 +20964,7 @@ function $ParseProvider() {
|
|
20837
20964
|
|
20838
20965
|
var lexer = new Lexer($parseOptions);
|
20839
20966
|
var parser = new Parser(lexer, $filter, $parseOptions);
|
20840
|
-
parsedExpression = parser.parse(exp
|
20967
|
+
parsedExpression = parser.parse(exp);
|
20841
20968
|
|
20842
20969
|
if (exp !== 'hasOwnProperty') {
|
20843
20970
|
// Only cache the value if it's not going to mess up the cache object
|
@@ -21048,7 +21175,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21048
21175
|
/**
|
21049
21176
|
* @ngdoc method
|
21050
21177
|
* @name $q#defer
|
21051
|
-
* @function
|
21178
|
+
* @kind function
|
21052
21179
|
*
|
21053
21180
|
* @description
|
21054
21181
|
* Creates a `Deferred` object which represents a task which will finish in the future.
|
@@ -21205,7 +21332,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21205
21332
|
/**
|
21206
21333
|
* @ngdoc method
|
21207
21334
|
* @name $q#reject
|
21208
|
-
* @function
|
21335
|
+
* @kind function
|
21209
21336
|
*
|
21210
21337
|
* @description
|
21211
21338
|
* Creates a promise that is resolved as rejected with the specified `reason`. This api should be
|
@@ -21265,7 +21392,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21265
21392
|
/**
|
21266
21393
|
* @ngdoc method
|
21267
21394
|
* @name $q#when
|
21268
|
-
* @function
|
21395
|
+
* @kind function
|
21269
21396
|
*
|
21270
21397
|
* @description
|
21271
21398
|
* Wraps an object that might be a value or a (3rd party) then-able promise into a $q promise.
|
@@ -21337,7 +21464,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
21337
21464
|
/**
|
21338
21465
|
* @ngdoc method
|
21339
21466
|
* @name $q#all
|
21340
|
-
* @function
|
21467
|
+
* @kind function
|
21341
21468
|
*
|
21342
21469
|
* @description
|
21343
21470
|
* Combines multiple promises into a single promise that is resolved when all of the input
|
@@ -21428,7 +21555,7 @@ function $$RAFProvider(){ //rAF
|
|
21428
21555
|
*
|
21429
21556
|
* Loop operations are optimized by using while(count--) { ... }
|
21430
21557
|
* - this means that in order to keep the same order of execution as addition we have to add
|
21431
|
-
* items to the array at the beginning (
|
21558
|
+
* items to the array at the beginning (unshift) instead of at the end (push)
|
21432
21559
|
*
|
21433
21560
|
* Child scopes are created and removed often
|
21434
21561
|
* - Using an array would be slow since inserts in middle are expensive so we use linked list
|
@@ -21562,7 +21689,7 @@ function $RootScopeProvider(){
|
|
21562
21689
|
/**
|
21563
21690
|
* @ngdoc method
|
21564
21691
|
* @name $rootScope.Scope#$new
|
21565
|
-
* @function
|
21692
|
+
* @kind function
|
21566
21693
|
*
|
21567
21694
|
* @description
|
21568
21695
|
* Creates a new child {@link ng.$rootScope.Scope scope}.
|
@@ -21594,18 +21721,23 @@ function $RootScopeProvider(){
|
|
21594
21721
|
child.$$asyncQueue = this.$$asyncQueue;
|
21595
21722
|
child.$$postDigestQueue = this.$$postDigestQueue;
|
21596
21723
|
} else {
|
21597
|
-
|
21598
|
-
|
21599
|
-
|
21600
|
-
|
21601
|
-
|
21602
|
-
|
21724
|
+
// Only create a child scope class if somebody asks for one,
|
21725
|
+
// but cache it to allow the VM to optimize lookups.
|
21726
|
+
if (!this.$$childScopeClass) {
|
21727
|
+
this.$$childScopeClass = function() {
|
21728
|
+
this.$$watchers = this.$$nextSibling =
|
21729
|
+
this.$$childHead = this.$$childTail = null;
|
21730
|
+
this.$$listeners = {};
|
21731
|
+
this.$$listenerCount = {};
|
21732
|
+
this.$id = nextUid();
|
21733
|
+
this.$$childScopeClass = null;
|
21734
|
+
};
|
21735
|
+
this.$$childScopeClass.prototype = this;
|
21736
|
+
}
|
21737
|
+
child = new this.$$childScopeClass();
|
21603
21738
|
}
|
21604
21739
|
child['this'] = child;
|
21605
|
-
child.$$listeners = {};
|
21606
|
-
child.$$listenerCount = {};
|
21607
21740
|
child.$parent = this;
|
21608
|
-
child.$$watchers = child.$$nextSibling = child.$$childHead = child.$$childTail = null;
|
21609
21741
|
child.$$prevSibling = this.$$childTail;
|
21610
21742
|
if (this.$$childHead) {
|
21611
21743
|
this.$$childTail.$$nextSibling = child;
|
@@ -21619,7 +21751,7 @@ function $RootScopeProvider(){
|
|
21619
21751
|
/**
|
21620
21752
|
* @ngdoc method
|
21621
21753
|
* @name $rootScope.Scope#$watch
|
21622
|
-
* @function
|
21754
|
+
* @kind function
|
21623
21755
|
*
|
21624
21756
|
* @description
|
21625
21757
|
* Registers a `listener` callback to be executed whenever the `watchExpression` changes.
|
@@ -21631,10 +21763,14 @@ function $RootScopeProvider(){
|
|
21631
21763
|
* {@link ng.$rootScope.Scope#$digest $digest()} and should be idempotent.)
|
21632
21764
|
* - The `listener` is called only when the value from the current `watchExpression` and the
|
21633
21765
|
* previous call to `watchExpression` are not equal (with the exception of the initial run,
|
21634
|
-
* see below).
|
21635
|
-
*
|
21636
|
-
*
|
21637
|
-
*
|
21766
|
+
* see below). Inequality is determined according to reference inequality,
|
21767
|
+
* [strict comparison](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Comparison_Operators)
|
21768
|
+
* via the `!==` Javascript operator, unless `objectEquality == true`
|
21769
|
+
* (see next point)
|
21770
|
+
* - When `objectEquality == true`, inequality of the `watchExpression` is determined
|
21771
|
+
* according to the {@link angular.equals} function. To save the value of the object for
|
21772
|
+
* later comparison, the {@link angular.copy} function is used. This therefore means that
|
21773
|
+
* watching complex objects will have adverse memory and performance implications.
|
21638
21774
|
* - The watch `listener` may change the model, which may trigger other `listener`s to fire.
|
21639
21775
|
* This is achieved by rerunning the watchers until no changes are detected. The rerun
|
21640
21776
|
* iteration limit is 10 to prevent an infinite loop deadlock.
|
@@ -21669,13 +21805,17 @@ function $RootScopeProvider(){
|
|
21669
21805
|
expect(scope.counter).toEqual(0);
|
21670
21806
|
|
21671
21807
|
scope.$digest();
|
21672
|
-
//
|
21673
|
-
expect(scope.counter).toEqual(
|
21808
|
+
// the listener is always called during the first $digest loop after it was registered
|
21809
|
+
expect(scope.counter).toEqual(1);
|
21674
21810
|
|
21675
|
-
scope.name = 'adam';
|
21676
21811
|
scope.$digest();
|
21812
|
+
// but now it will not be called unless the value changes
|
21677
21813
|
expect(scope.counter).toEqual(1);
|
21678
21814
|
|
21815
|
+
scope.name = 'adam';
|
21816
|
+
scope.$digest();
|
21817
|
+
expect(scope.counter).toEqual(2);
|
21818
|
+
|
21679
21819
|
|
21680
21820
|
|
21681
21821
|
// Using a listener function
|
@@ -21761,7 +21901,7 @@ function $RootScopeProvider(){
|
|
21761
21901
|
// the while loop reads in reverse order.
|
21762
21902
|
array.unshift(watcher);
|
21763
21903
|
|
21764
|
-
return function() {
|
21904
|
+
return function deregisterWatch() {
|
21765
21905
|
arrayRemove(array, watcher);
|
21766
21906
|
lastDirtyWatch = null;
|
21767
21907
|
};
|
@@ -21771,7 +21911,7 @@ function $RootScopeProvider(){
|
|
21771
21911
|
/**
|
21772
21912
|
* @ngdoc method
|
21773
21913
|
* @name $rootScope.Scope#$watchCollection
|
21774
|
-
* @function
|
21914
|
+
* @kind function
|
21775
21915
|
*
|
21776
21916
|
* @description
|
21777
21917
|
* Shallow watches the properties of an object and fires whenever any of the properties change
|
@@ -21947,7 +22087,7 @@ function $RootScopeProvider(){
|
|
21947
22087
|
/**
|
21948
22088
|
* @ngdoc method
|
21949
22089
|
* @name $rootScope.Scope#$digest
|
21950
|
-
* @function
|
22090
|
+
* @kind function
|
21951
22091
|
*
|
21952
22092
|
* @description
|
21953
22093
|
* Processes all of the {@link ng.$rootScope.Scope#$watch watchers} of the current scope and
|
@@ -21982,12 +22122,16 @@ function $RootScopeProvider(){
|
|
21982
22122
|
expect(scope.counter).toEqual(0);
|
21983
22123
|
|
21984
22124
|
scope.$digest();
|
21985
|
-
//
|
21986
|
-
expect(scope.counter).toEqual(
|
22125
|
+
// the listener is always called during the first $digest loop after it was registered
|
22126
|
+
expect(scope.counter).toEqual(1);
|
21987
22127
|
|
21988
|
-
scope.name = 'adam';
|
21989
22128
|
scope.$digest();
|
22129
|
+
// but now it will not be called unless the value changes
|
21990
22130
|
expect(scope.counter).toEqual(1);
|
22131
|
+
|
22132
|
+
scope.name = 'adam';
|
22133
|
+
scope.$digest();
|
22134
|
+
expect(scope.counter).toEqual(2);
|
21991
22135
|
* ```
|
21992
22136
|
*
|
21993
22137
|
*/
|
@@ -22039,7 +22183,7 @@ function $RootScopeProvider(){
|
|
22039
22183
|
&& isNaN(value) && isNaN(last)))) {
|
22040
22184
|
dirty = true;
|
22041
22185
|
lastDirtyWatch = watch;
|
22042
|
-
watch.last = watch.eq ? copy(value) : value;
|
22186
|
+
watch.last = watch.eq ? copy(value, null) : value;
|
22043
22187
|
watch.fn(value, ((last === initWatchVal) ? value : last), current);
|
22044
22188
|
if (ttl < 5) {
|
22045
22189
|
logIdx = 4 - ttl;
|
@@ -22114,7 +22258,7 @@ function $RootScopeProvider(){
|
|
22114
22258
|
/**
|
22115
22259
|
* @ngdoc method
|
22116
22260
|
* @name $rootScope.Scope#$destroy
|
22117
|
-
* @function
|
22261
|
+
* @kind function
|
22118
22262
|
*
|
22119
22263
|
* @description
|
22120
22264
|
* Removes the current scope (and all of its children) from the parent scope. Removal implies
|
@@ -22175,7 +22319,7 @@ function $RootScopeProvider(){
|
|
22175
22319
|
/**
|
22176
22320
|
* @ngdoc method
|
22177
22321
|
* @name $rootScope.Scope#$eval
|
22178
|
-
* @function
|
22322
|
+
* @kind function
|
22179
22323
|
*
|
22180
22324
|
* @description
|
22181
22325
|
* Executes the `expression` on the current scope and returns the result. Any exceptions in
|
@@ -22207,7 +22351,7 @@ function $RootScopeProvider(){
|
|
22207
22351
|
/**
|
22208
22352
|
* @ngdoc method
|
22209
22353
|
* @name $rootScope.Scope#$evalAsync
|
22210
|
-
* @function
|
22354
|
+
* @kind function
|
22211
22355
|
*
|
22212
22356
|
* @description
|
22213
22357
|
* Executes the expression on the current scope at a later point in time.
|
@@ -22254,7 +22398,7 @@ function $RootScopeProvider(){
|
|
22254
22398
|
/**
|
22255
22399
|
* @ngdoc method
|
22256
22400
|
* @name $rootScope.Scope#$apply
|
22257
|
-
* @function
|
22401
|
+
* @kind function
|
22258
22402
|
*
|
22259
22403
|
* @description
|
22260
22404
|
* `$apply()` is used to execute an expression in angular from outside of the angular
|
@@ -22316,7 +22460,7 @@ function $RootScopeProvider(){
|
|
22316
22460
|
/**
|
22317
22461
|
* @ngdoc method
|
22318
22462
|
* @name $rootScope.Scope#$on
|
22319
|
-
* @function
|
22463
|
+
* @kind function
|
22320
22464
|
*
|
22321
22465
|
* @description
|
22322
22466
|
* Listens on events of a given type. See {@link ng.$rootScope.Scope#$emit $emit} for
|
@@ -22365,7 +22509,7 @@ function $RootScopeProvider(){
|
|
22365
22509
|
/**
|
22366
22510
|
* @ngdoc method
|
22367
22511
|
* @name $rootScope.Scope#$emit
|
22368
|
-
* @function
|
22512
|
+
* @kind function
|
22369
22513
|
*
|
22370
22514
|
* @description
|
22371
22515
|
* Dispatches an event `name` upwards through the scope hierarchy notifying the
|
@@ -22433,7 +22577,7 @@ function $RootScopeProvider(){
|
|
22433
22577
|
/**
|
22434
22578
|
* @ngdoc method
|
22435
22579
|
* @name $rootScope.Scope#$broadcast
|
22436
|
-
* @function
|
22580
|
+
* @kind function
|
22437
22581
|
*
|
22438
22582
|
* @description
|
22439
22583
|
* Dispatches an event `name` downwards to all child scopes (and their children) notifying the
|
@@ -22681,7 +22825,7 @@ function adjustMatchers(matchers) {
|
|
22681
22825
|
/**
|
22682
22826
|
* @ngdoc service
|
22683
22827
|
* @name $sceDelegate
|
22684
|
-
* @function
|
22828
|
+
* @kind function
|
22685
22829
|
*
|
22686
22830
|
* @description
|
22687
22831
|
*
|
@@ -22753,7 +22897,7 @@ function $SceDelegateProvider() {
|
|
22753
22897
|
/**
|
22754
22898
|
* @ngdoc method
|
22755
22899
|
* @name $sceDelegateProvider#resourceUrlWhitelist
|
22756
|
-
* @function
|
22900
|
+
* @kind function
|
22757
22901
|
*
|
22758
22902
|
* @param {Array=} whitelist When provided, replaces the resourceUrlWhitelist with the value
|
22759
22903
|
* provided. This must be an array or null. A snapshot of this array is used so further
|
@@ -22782,7 +22926,7 @@ function $SceDelegateProvider() {
|
|
22782
22926
|
/**
|
22783
22927
|
* @ngdoc method
|
22784
22928
|
* @name $sceDelegateProvider#resourceUrlBlacklist
|
22785
|
-
* @function
|
22929
|
+
* @kind function
|
22786
22930
|
*
|
22787
22931
|
* @param {Array=} blacklist When provided, replaces the resourceUrlBlacklist with the value
|
22788
22932
|
* provided. This must be an array or null. A snapshot of this array is used so further
|
@@ -23009,7 +23153,7 @@ function $SceDelegateProvider() {
|
|
23009
23153
|
/**
|
23010
23154
|
* @ngdoc service
|
23011
23155
|
* @name $sce
|
23012
|
-
* @function
|
23156
|
+
* @kind function
|
23013
23157
|
*
|
23014
23158
|
* @description
|
23015
23159
|
*
|
@@ -23135,7 +23279,7 @@ function $SceDelegateProvider() {
|
|
23135
23279
|
*
|
23136
23280
|
* | Context | Notes |
|
23137
23281
|
* |---------------------|----------------|
|
23138
|
-
* | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. |
|
23282
|
+
* | `$sce.HTML` | For HTML that's safe to source into the application. The {@link ng.directive:ngBindHtml ngBindHtml} directive uses this context for bindings. If an unsafe value is encountered and the {@link ngSanitize $sanitize} module is present this will sanitize the value instead of throwing an error. |
|
23139
23283
|
* | `$sce.CSS` | For CSS that's safe to source into the application. Currently unused. Feel free to use it in your own directives. |
|
23140
23284
|
* | `$sce.URL` | For URLs that are safe to follow as links. Currently unused (`<a href=` and `<img src=` sanitize their urls and don't constitute an SCE context. |
|
23141
23285
|
* | `$sce.RESOURCE_URL` | For URLs that are not only safe to follow as links, but whose contents are also safe to include in your application. Examples include `ng-include`, `src` / `ngSrc` bindings for tags other than `IMG` (e.g. `IFRAME`, `OBJECT`, etc.) <br><br>Note that `$sce.RESOURCE_URL` makes a stronger statement about the URL than `$sce.URL` does and therefore contexts requiring values trusted for `$sce.RESOURCE_URL` can be used anywhere that values trusted for `$sce.URL` are required. |
|
@@ -23159,7 +23303,7 @@ function $SceDelegateProvider() {
|
|
23159
23303
|
* - `**`: matches zero or more occurrences of *any* character. As such, it's not
|
23160
23304
|
* not appropriate to use in for a scheme, domain, etc. as it would match too much. (e.g.
|
23161
23305
|
* http://**.example.com/ would match http://evil.com/?ignore=.example.com/ and that might
|
23162
|
-
* not have been the intention.)
|
23306
|
+
* not have been the intention.) Its usage at the very end of the path is ok. (e.g.
|
23163
23307
|
* http://foo.example.com/templates/**).
|
23164
23308
|
* - **RegExp** (*see caveat below*)
|
23165
23309
|
* - *Caveat*: While regular expressions are powerful and offer great flexibility, their syntax
|
@@ -23280,7 +23424,7 @@ function $SceProvider() {
|
|
23280
23424
|
/**
|
23281
23425
|
* @ngdoc method
|
23282
23426
|
* @name $sceProvider#enabled
|
23283
|
-
* @function
|
23427
|
+
* @kind function
|
23284
23428
|
*
|
23285
23429
|
* @param {boolean=} value If provided, then enables/disables SCE.
|
23286
23430
|
* @return {boolean} true if SCE is enabled, false otherwise.
|
@@ -23353,12 +23497,12 @@ function $SceProvider() {
|
|
23353
23497
|
'document. See http://docs.angularjs.org/api/ng.$sce for more information.');
|
23354
23498
|
}
|
23355
23499
|
|
23356
|
-
var sce =
|
23500
|
+
var sce = shallowCopy(SCE_CONTEXTS);
|
23357
23501
|
|
23358
23502
|
/**
|
23359
23503
|
* @ngdoc method
|
23360
23504
|
* @name $sce#isEnabled
|
23361
|
-
* @function
|
23505
|
+
* @kind function
|
23362
23506
|
*
|
23363
23507
|
* @return {Boolean} true if SCE is enabled, false otherwise. If you want to set the value, you
|
23364
23508
|
* have to do it at module config time on {@link ng.$sceProvider $sceProvider}.
|
@@ -23893,7 +24037,7 @@ var originUrl = urlResolve(window.location.href, true);
|
|
23893
24037
|
* https://github.com/angular/angular.js/pull/2902
|
23894
24038
|
* http://james.padolsey.com/javascript/parsing-urls-with-the-dom/
|
23895
24039
|
*
|
23896
|
-
* @function
|
24040
|
+
* @kind function
|
23897
24041
|
* @param {string} url The URL to be parsed.
|
23898
24042
|
* @description Normalizes and parses a URL.
|
23899
24043
|
* @returns {object} Returns the normalized URL as a dictionary.
|
@@ -24057,7 +24201,7 @@ function $WindowProvider(){
|
|
24057
24201
|
/**
|
24058
24202
|
* @ngdoc service
|
24059
24203
|
* @name $filter
|
24060
|
-
* @function
|
24204
|
+
* @kind function
|
24061
24205
|
* @description
|
24062
24206
|
* Filters are used for formatting data displayed to the user.
|
24063
24207
|
*
|
@@ -24067,7 +24211,24 @@ function $WindowProvider(){
|
|
24067
24211
|
*
|
24068
24212
|
* @param {String} name Name of the filter function to retrieve
|
24069
24213
|
* @return {Function} the filter function
|
24070
|
-
|
24214
|
+
* @example
|
24215
|
+
<example name="$filter" module="filterExample">
|
24216
|
+
<file name="index.html">
|
24217
|
+
<div ng-controller="MainCtrl">
|
24218
|
+
<h3>{{ originalText }}</h3>
|
24219
|
+
<h3>{{ filteredText }}</h3>
|
24220
|
+
</div>
|
24221
|
+
</file>
|
24222
|
+
|
24223
|
+
<file name="script.js">
|
24224
|
+
angular.module('filterExample', [])
|
24225
|
+
.controller('MainCtrl', function($scope, $filter) {
|
24226
|
+
$scope.originalText = 'hello';
|
24227
|
+
$scope.filteredText = $filter('uppercase')($scope.originalText);
|
24228
|
+
});
|
24229
|
+
</file>
|
24230
|
+
</example>
|
24231
|
+
*/
|
24071
24232
|
$FilterProvider.$inject = ['$provide'];
|
24072
24233
|
function $FilterProvider($provide) {
|
24073
24234
|
var suffix = 'Filter';
|
@@ -24127,7 +24288,7 @@ function $FilterProvider($provide) {
|
|
24127
24288
|
/**
|
24128
24289
|
* @ngdoc filter
|
24129
24290
|
* @name filter
|
24130
|
-
* @function
|
24291
|
+
* @kind function
|
24131
24292
|
*
|
24132
24293
|
* @description
|
24133
24294
|
* Selects a subset of items from `array` and returns it as a new array.
|
@@ -24159,15 +24320,15 @@ function $FilterProvider($provide) {
|
|
24159
24320
|
*
|
24160
24321
|
* Can be one of:
|
24161
24322
|
*
|
24162
|
-
*
|
24163
|
-
*
|
24164
|
-
*
|
24323
|
+
* - `function(actual, expected)`:
|
24324
|
+
* The function will be given the object value and the predicate value to compare and
|
24325
|
+
* should return true if the item should be included in filtered result.
|
24165
24326
|
*
|
24166
|
-
*
|
24167
|
-
*
|
24327
|
+
* - `true`: A shorthand for `function(actual, expected) { return angular.equals(expected, actual)}`.
|
24328
|
+
* this is essentially strict comparison of expected and actual.
|
24168
24329
|
*
|
24169
|
-
*
|
24170
|
-
*
|
24330
|
+
* - `false|undefined`: A short hand for a function which will look for a substring match in case
|
24331
|
+
* insensitive way.
|
24171
24332
|
*
|
24172
24333
|
* @example
|
24173
24334
|
<example>
|
@@ -24346,7 +24507,7 @@ function filterFilter() {
|
|
24346
24507
|
/**
|
24347
24508
|
* @ngdoc filter
|
24348
24509
|
* @name currency
|
24349
|
-
* @function
|
24510
|
+
* @kind function
|
24350
24511
|
*
|
24351
24512
|
* @description
|
24352
24513
|
* Formats a number as a currency (ie $1,234.56). When no currency symbol is provided, default
|
@@ -24403,7 +24564,7 @@ function currencyFilter($locale) {
|
|
24403
24564
|
/**
|
24404
24565
|
* @ngdoc filter
|
24405
24566
|
* @name number
|
24406
|
-
* @function
|
24567
|
+
* @kind function
|
24407
24568
|
*
|
24408
24569
|
* @description
|
24409
24570
|
* Formats a number as text.
|
@@ -24488,8 +24649,8 @@ function formatNumber(number, pattern, groupSep, decimalSep, fractionSize) {
|
|
24488
24649
|
fractionSize = Math.min(Math.max(pattern.minFrac, fractionLen), pattern.maxFrac);
|
24489
24650
|
}
|
24490
24651
|
|
24491
|
-
var pow = Math.pow(10, fractionSize);
|
24492
|
-
number = Math.
|
24652
|
+
var pow = Math.pow(10, fractionSize + 1);
|
24653
|
+
number = Math.floor(number * pow + 5) / pow;
|
24493
24654
|
var fraction = ('' + number).split(DECIMAL_SEP);
|
24494
24655
|
var whole = fraction[0];
|
24495
24656
|
fraction = fraction[1] || '';
|
@@ -24615,7 +24776,7 @@ var DATE_FORMATS_SPLIT = /((?:[^yMdHhmsaZE']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|d+
|
|
24615
24776
|
/**
|
24616
24777
|
* @ngdoc filter
|
24617
24778
|
* @name date
|
24618
|
-
* @function
|
24779
|
+
* @kind function
|
24619
24780
|
*
|
24620
24781
|
* @description
|
24621
24782
|
* Formats `date` to a string based on the requested `format`.
|
@@ -24772,7 +24933,7 @@ function dateFilter($locale) {
|
|
24772
24933
|
/**
|
24773
24934
|
* @ngdoc filter
|
24774
24935
|
* @name json
|
24775
|
-
* @function
|
24936
|
+
* @kind function
|
24776
24937
|
*
|
24777
24938
|
* @description
|
24778
24939
|
* Allows you to convert a JavaScript object into JSON string.
|
@@ -24807,7 +24968,7 @@ function jsonFilter() {
|
|
24807
24968
|
/**
|
24808
24969
|
* @ngdoc filter
|
24809
24970
|
* @name lowercase
|
24810
|
-
* @function
|
24971
|
+
* @kind function
|
24811
24972
|
* @description
|
24812
24973
|
* Converts string to lowercase.
|
24813
24974
|
* @see angular.lowercase
|
@@ -24818,7 +24979,7 @@ var lowercaseFilter = valueFn(lowercase);
|
|
24818
24979
|
/**
|
24819
24980
|
* @ngdoc filter
|
24820
24981
|
* @name uppercase
|
24821
|
-
* @function
|
24982
|
+
* @kind function
|
24822
24983
|
* @description
|
24823
24984
|
* Converts string to uppercase.
|
24824
24985
|
* @see angular.uppercase
|
@@ -24828,7 +24989,7 @@ var uppercaseFilter = valueFn(uppercase);
|
|
24828
24989
|
/**
|
24829
24990
|
* @ngdoc filter
|
24830
24991
|
* @name limitTo
|
24831
|
-
* @function
|
24992
|
+
* @kind function
|
24832
24993
|
*
|
24833
24994
|
* @description
|
24834
24995
|
* Creates a new array or string containing only a specified number of elements. The elements
|
@@ -24898,7 +25059,11 @@ function limitToFilter(){
|
|
24898
25059
|
return function(input, limit) {
|
24899
25060
|
if (!isArray(input) && !isString(input)) return input;
|
24900
25061
|
|
24901
|
-
|
25062
|
+
if (Math.abs(Number(limit)) === Infinity) {
|
25063
|
+
limit = Number(limit);
|
25064
|
+
} else {
|
25065
|
+
limit = int(limit);
|
25066
|
+
}
|
24902
25067
|
|
24903
25068
|
if (isString(input)) {
|
24904
25069
|
//NaN check on limit
|
@@ -24937,10 +25102,12 @@ function limitToFilter(){
|
|
24937
25102
|
/**
|
24938
25103
|
* @ngdoc filter
|
24939
25104
|
* @name orderBy
|
24940
|
-
* @function
|
25105
|
+
* @kind function
|
24941
25106
|
*
|
24942
25107
|
* @description
|
24943
|
-
* Orders a specified `array` by the `expression` predicate.
|
25108
|
+
* Orders a specified `array` by the `expression` predicate. It is ordered alphabetically
|
25109
|
+
* for strings and numerically for numbers. Note: if you notice numbers are not being sorted
|
25110
|
+
* correctly, make sure they are actually being saved as numbers and not strings.
|
24944
25111
|
*
|
24945
25112
|
* @param {Array} array The array to sort.
|
24946
25113
|
* @param {function(*)|string|Array.<(function(*)|string)>} expression A predicate to be
|
@@ -24993,6 +25160,51 @@ function limitToFilter(){
|
|
24993
25160
|
</div>
|
24994
25161
|
</file>
|
24995
25162
|
</example>
|
25163
|
+
*
|
25164
|
+
* It's also possible to call the orderBy filter manually, by injecting `$filter`, retrieving the
|
25165
|
+
* filter routine with `$filter('orderBy')`, and calling the returned filter routine with the
|
25166
|
+
* desired parameters.
|
25167
|
+
*
|
25168
|
+
* Example:
|
25169
|
+
*
|
25170
|
+
* @example
|
25171
|
+
<example>
|
25172
|
+
<file name="index.html">
|
25173
|
+
<div ng-controller="Ctrl">
|
25174
|
+
<table class="friend">
|
25175
|
+
<tr>
|
25176
|
+
<th><a href="" ng-click="reverse=false;order('name', false)">Name</a>
|
25177
|
+
(<a href="" ng-click="order('-name',false)">^</a>)</th>
|
25178
|
+
<th><a href="" ng-click="reverse=!reverse;order('phone', reverse)">Phone Number</a></th>
|
25179
|
+
<th><a href="" ng-click="reverse=!reverse;order('age',reverse)">Age</a></th>
|
25180
|
+
</tr>
|
25181
|
+
<tr ng-repeat="friend in friends">
|
25182
|
+
<td>{{friend.name}}</td>
|
25183
|
+
<td>{{friend.phone}}</td>
|
25184
|
+
<td>{{friend.age}}</td>
|
25185
|
+
</tr>
|
25186
|
+
</table>
|
25187
|
+
</div>
|
25188
|
+
</file>
|
25189
|
+
|
25190
|
+
<file name="script.js">
|
25191
|
+
function Ctrl($scope, $filter) {
|
25192
|
+
var orderBy = $filter('orderBy');
|
25193
|
+
$scope.friends = [
|
25194
|
+
{ name: 'John', phone: '555-1212', age: 10 },
|
25195
|
+
{ name: 'Mary', phone: '555-9876', age: 19 },
|
25196
|
+
{ name: 'Mike', phone: '555-4321', age: 21 },
|
25197
|
+
{ name: 'Adam', phone: '555-5678', age: 35 },
|
25198
|
+
{ name: 'Julie', phone: '555-8765', age: 29 }
|
25199
|
+
];
|
25200
|
+
|
25201
|
+
$scope.order = function(predicate, reverse) {
|
25202
|
+
$scope.friends = orderBy($scope.friends, predicate, reverse);
|
25203
|
+
};
|
25204
|
+
$scope.order('-age',false);
|
25205
|
+
}
|
25206
|
+
</file>
|
25207
|
+
</example>
|
24996
25208
|
*/
|
24997
25209
|
orderByFilter.$inject = ['$parse'];
|
24998
25210
|
function orderByFilter($parse){
|
@@ -25544,7 +25756,7 @@ var nullFormCtrl = {
|
|
25544
25756
|
* - `url`
|
25545
25757
|
*
|
25546
25758
|
* @description
|
25547
|
-
* `FormController` keeps track of all its controls and nested forms as well as state of them,
|
25759
|
+
* `FormController` keeps track of all its controls and nested forms as well as the state of them,
|
25548
25760
|
* such as being valid/invalid or dirty/pristine.
|
25549
25761
|
*
|
25550
25762
|
* Each {@link ng.directive:form form} directive creates an instance
|
@@ -26386,6 +26598,8 @@ function addNativeHtml5Validators(ctrl, validatorName, element) {
|
|
26386
26598
|
|
26387
26599
|
function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
26388
26600
|
var validity = element.prop('validity');
|
26601
|
+
var placeholder = element[0].placeholder, noevent = {};
|
26602
|
+
|
26389
26603
|
// In composition mode, users are still inputing intermediate text buffer,
|
26390
26604
|
// hold the listener until composition is done.
|
26391
26605
|
// More about composition events: https://developer.mozilla.org/en-US/docs/Web/API/CompositionEvent
|
@@ -26402,10 +26616,19 @@ function textInputType(scope, element, attr, ctrl, $sniffer, $browser) {
|
|
26402
26616
|
});
|
26403
26617
|
}
|
26404
26618
|
|
26405
|
-
var listener = function() {
|
26619
|
+
var listener = function(ev) {
|
26406
26620
|
if (composing) return;
|
26407
26621
|
var value = element.val();
|
26408
26622
|
|
26623
|
+
// IE (11 and under) seem to emit an 'input' event if the placeholder value changes.
|
26624
|
+
// We don't want to dirty the value when this happens, so we abort here. Unfortunately,
|
26625
|
+
// IE also sends input events for other non-input-related things, (such as focusing on a
|
26626
|
+
// form control), so this change is not entirely enough to solve this.
|
26627
|
+
if (msie && (ev || noevent).type === 'input' && element[0].placeholder !== placeholder) {
|
26628
|
+
placeholder = element[0].placeholder;
|
26629
|
+
return;
|
26630
|
+
}
|
26631
|
+
|
26409
26632
|
// By default we will trim the value
|
26410
26633
|
// If the attribute ng-trim exists we will avoid trimming
|
26411
26634
|
// e.g. <input ng-model="foo" ng-trim="false">
|
@@ -26669,6 +26892,7 @@ function checkboxInputType(scope, element, attr, ctrl) {
|
|
26669
26892
|
* patterns defined as scope expressions.
|
26670
26893
|
* @param {string=} ngChange Angular expression to be executed when input changes due to user
|
26671
26894
|
* interaction with the input element.
|
26895
|
+
* @param {boolean=} [ngTrim=true] If set to false Angular will not automatically trim the input.
|
26672
26896
|
*/
|
26673
26897
|
|
26674
26898
|
|
@@ -26818,14 +27042,14 @@ var VALID_CLASS = 'ng-valid',
|
|
26818
27042
|
* @property {Array.<Function>} $formatters Array of functions to execute, as a pipeline, whenever
|
26819
27043
|
the model value changes. Each function is called, in turn, passing the value through to the
|
26820
27044
|
next. Used to format / convert values for display in the control and validation.
|
26821
|
-
*
|
26822
|
-
*
|
26823
|
-
*
|
26824
|
-
*
|
26825
|
-
*
|
26826
|
-
*
|
26827
|
-
*
|
26828
|
-
*
|
27045
|
+
* ```js
|
27046
|
+
* function formatter(value) {
|
27047
|
+
* if (value) {
|
27048
|
+
* return value.toUpperCase();
|
27049
|
+
* }
|
27050
|
+
* }
|
27051
|
+
* ngModel.$formatters.push(formatter);
|
27052
|
+
* ```
|
26829
27053
|
*
|
26830
27054
|
* @property {Array.<Function>} $viewChangeListeners Array of functions to execute whenever the
|
26831
27055
|
* view value has changed. It is called with no arguments, and its return value is ignored.
|
@@ -26854,7 +27078,12 @@ var VALID_CLASS = 'ng-valid',
|
|
26854
27078
|
* Note that `contenteditable` is an HTML5 attribute, which tells the browser to let the element
|
26855
27079
|
* contents be edited in place by the user. This will not work on older browsers.
|
26856
27080
|
*
|
26857
|
-
*
|
27081
|
+
* We are using the {@link ng.service:$sce $sce} service here and include the {@link ngSanitize $sanitize}
|
27082
|
+
* module to automatically remove "bad" content like inline event listener (e.g. `<span onclick="...">`).
|
27083
|
+
* However, as we are using `$sce` the model can still decide to to provide unsafe content if it marks
|
27084
|
+
* that content using the `$sce` service.
|
27085
|
+
*
|
27086
|
+
* <example name="NgModelController" module="customControl" deps="angular-sanitize.js">
|
26858
27087
|
<file name="style.css">
|
26859
27088
|
[contenteditable] {
|
26860
27089
|
border: 1px solid black;
|
@@ -26868,8 +27097,8 @@ var VALID_CLASS = 'ng-valid',
|
|
26868
27097
|
|
26869
27098
|
</file>
|
26870
27099
|
<file name="script.js">
|
26871
|
-
angular.module('customControl', []).
|
26872
|
-
directive('contenteditable', function() {
|
27100
|
+
angular.module('customControl', ['ngSanitize']).
|
27101
|
+
directive('contenteditable', ['$sce', function($sce) {
|
26873
27102
|
return {
|
26874
27103
|
restrict: 'A', // only activate on element attribute
|
26875
27104
|
require: '?ngModel', // get a hold of NgModelController
|
@@ -26878,7 +27107,7 @@ var VALID_CLASS = 'ng-valid',
|
|
26878
27107
|
|
26879
27108
|
// Specify how UI should be updated
|
26880
27109
|
ngModel.$render = function() {
|
26881
|
-
element.html(ngModel.$viewValue || '');
|
27110
|
+
element.html($sce.getTrustedHtml(ngModel.$viewValue || ''));
|
26882
27111
|
};
|
26883
27112
|
|
26884
27113
|
// Listen for change events to enable binding
|
@@ -26899,7 +27128,7 @@ var VALID_CLASS = 'ng-valid',
|
|
26899
27128
|
}
|
26900
27129
|
}
|
26901
27130
|
};
|
26902
|
-
});
|
27131
|
+
}]);
|
26903
27132
|
</file>
|
26904
27133
|
<file name="index.html">
|
26905
27134
|
<form name="myForm">
|
@@ -27573,14 +27802,19 @@ var ngValueDirective = function() {
|
|
27573
27802
|
</file>
|
27574
27803
|
</example>
|
27575
27804
|
*/
|
27576
|
-
var ngBindDirective = ngDirective(
|
27577
|
-
|
27578
|
-
|
27579
|
-
|
27580
|
-
|
27581
|
-
|
27582
|
-
|
27583
|
-
|
27805
|
+
var ngBindDirective = ngDirective({
|
27806
|
+
compile: function(templateElement) {
|
27807
|
+
templateElement.addClass('ng-binding');
|
27808
|
+
return function (scope, element, attr) {
|
27809
|
+
element.data('$binding', attr.ngBind);
|
27810
|
+
scope.$watch(attr.ngBind, function ngBindWatchAction(value) {
|
27811
|
+
// We are purposefully using == here rather than === because we want to
|
27812
|
+
// catch when value is "null or undefined"
|
27813
|
+
// jshint -W041
|
27814
|
+
element.text(value == undefined ? '' : value);
|
27815
|
+
});
|
27816
|
+
};
|
27817
|
+
}
|
27584
27818
|
});
|
27585
27819
|
|
27586
27820
|
|
@@ -27724,7 +27958,7 @@ function classDirective(name, selector) {
|
|
27724
27958
|
scope.$watch('$index', function($index, old$index) {
|
27725
27959
|
// jshint bitwise: false
|
27726
27960
|
var mod = $index & 1;
|
27727
|
-
if (mod !== old$index & 1) {
|
27961
|
+
if (mod !== (old$index & 1)) {
|
27728
27962
|
var classes = arrayClasses(scope.$eval(attr[name]));
|
27729
27963
|
mod === selector ?
|
27730
27964
|
addClasses(classes) :
|
@@ -27783,7 +28017,7 @@ function classDirective(name, selector) {
|
|
27783
28017
|
updateClasses(oldClasses, newClasses);
|
27784
28018
|
}
|
27785
28019
|
}
|
27786
|
-
oldVal =
|
28020
|
+
oldVal = shallowCopy(newVal);
|
27787
28021
|
}
|
27788
28022
|
}
|
27789
28023
|
};
|
@@ -27811,7 +28045,7 @@ function classDirective(name, selector) {
|
|
27811
28045
|
var classes = [], i = 0;
|
27812
28046
|
forEach(classVal, function(v, k) {
|
27813
28047
|
if (v) {
|
27814
|
-
classes.
|
28048
|
+
classes = classes.concat(k.split(' '));
|
27815
28049
|
}
|
27816
28050
|
});
|
27817
28051
|
return classes;
|
@@ -28136,7 +28370,7 @@ var ngCloakDirective = ngDirective({
|
|
28136
28370
|
*
|
28137
28371
|
* MVC components in angular:
|
28138
28372
|
*
|
28139
|
-
* * Model —
|
28373
|
+
* * Model — Models are the properties of a scope; scopes are attached to the DOM where scope properties
|
28140
28374
|
* are accessed through bindings.
|
28141
28375
|
* * View — The template (HTML with data bindings) that is rendered into the View.
|
28142
28376
|
* * Controller — The `ngController` directive specifies a Controller class; the class contains business
|
@@ -28157,165 +28391,186 @@ var ngCloakDirective = ngDirective({
|
|
28157
28391
|
* @example
|
28158
28392
|
* Here is a simple form for editing user contact information. Adding, removing, clearing, and
|
28159
28393
|
* greeting are methods declared on the controller (see source tab). These methods can
|
28160
|
-
* easily be called from the angular markup.
|
28161
|
-
*
|
28162
|
-
*
|
28163
|
-
*
|
28164
|
-
*
|
28165
|
-
|
28166
|
-
|
28167
|
-
|
28168
|
-
|
28169
|
-
|
28170
|
-
|
28171
|
-
|
28172
|
-
|
28173
|
-
|
28174
|
-
|
28175
|
-
|
28176
|
-
|
28177
|
-
|
28178
|
-
|
28179
|
-
|
28180
|
-
|
28181
|
-
|
28182
|
-
|
28183
|
-
|
28184
|
-
|
28185
|
-
|
28186
|
-
|
28187
|
-
|
28188
|
-
|
28189
|
-
|
28190
|
-
|
28191
|
-
|
28192
|
-
|
28193
|
-
|
28194
|
-
|
28195
|
-
|
28196
|
-
|
28197
|
-
|
28198
|
-
|
28199
|
-
|
28200
|
-
|
28201
|
-
|
28202
|
-
|
28203
|
-
|
28204
|
-
|
28205
|
-
|
28206
|
-
|
28207
|
-
|
28208
|
-
|
28209
|
-
|
28210
|
-
|
28211
|
-
|
28212
|
-
|
28213
|
-
|
28214
|
-
|
28215
|
-
|
28216
|
-
|
28217
|
-
|
28218
|
-
|
28219
|
-
|
28220
|
-
|
28221
|
-
|
28222
|
-
|
28223
|
-
|
28224
|
-
|
28225
|
-
|
28226
|
-
|
28227
|
-
|
28228
|
-
|
28229
|
-
|
28230
|
-
|
28231
|
-
|
28232
|
-
|
28233
|
-
|
28234
|
-
|
28235
|
-
|
28236
|
-
|
28237
|
-
|
28238
|
-
|
28239
|
-
|
28240
|
-
|
28241
|
-
|
28242
|
-
|
28243
|
-
|
28244
|
-
|
28245
|
-
|
28246
|
-
|
28247
|
-
|
28248
|
-
|
28249
|
-
|
28250
|
-
|
28251
|
-
|
28252
|
-
|
28253
|
-
|
28254
|
-
|
28255
|
-
|
28256
|
-
|
28257
|
-
|
28258
|
-
|
28259
|
-
|
28260
|
-
|
28261
|
-
|
28262
|
-
|
28263
|
-
|
28264
|
-
|
28265
|
-
|
28266
|
-
|
28267
|
-
|
28268
|
-
|
28269
|
-
|
28270
|
-
|
28271
|
-
|
28272
|
-
|
28273
|
-
|
28274
|
-
|
28275
|
-
|
28276
|
-
|
28277
|
-
|
28278
|
-
|
28279
|
-
|
28280
|
-
|
28281
|
-
|
28282
|
-
|
28283
|
-
|
28284
|
-
|
28285
|
-
|
28286
|
-
|
28287
|
-
|
28288
|
-
|
28289
|
-
|
28290
|
-
|
28291
|
-
|
28292
|
-
|
28293
|
-
|
28294
|
-
|
28295
|
-
|
28296
|
-
|
28297
|
-
|
28298
|
-
|
28299
|
-
|
28300
|
-
|
28301
|
-
|
28302
|
-
|
28303
|
-
|
28304
|
-
|
28305
|
-
|
28306
|
-
|
28307
|
-
|
28308
|
-
|
28309
|
-
|
28310
|
-
|
28311
|
-
|
28312
|
-
|
28313
|
-
|
28314
|
-
|
28315
|
-
|
28316
|
-
|
28317
|
-
|
28318
|
-
|
28394
|
+
* easily be called from the angular markup. Any changes to the data are automatically reflected
|
28395
|
+
* in the View without the need for a manual update.
|
28396
|
+
*
|
28397
|
+
* Two different declaration styles are included below:
|
28398
|
+
*
|
28399
|
+
* * one binds methods and properties directly onto the controller using `this`:
|
28400
|
+
* `ng-controller="SettingsController1 as settings"`
|
28401
|
+
* * one injects `$scope` into the controller:
|
28402
|
+
* `ng-controller="SettingsController2"`
|
28403
|
+
*
|
28404
|
+
* The second option is more common in the Angular community, and is generally used in boilerplates
|
28405
|
+
* and in this guide. However, there are advantages to binding properties directly to the controller
|
28406
|
+
* and avoiding scope.
|
28407
|
+
*
|
28408
|
+
* * Using `controller as` makes it obvious which controller you are accessing in the template when
|
28409
|
+
* multiple controllers apply to an element.
|
28410
|
+
* * If you are writing your controllers as classes you have easier access to the properties and
|
28411
|
+
* methods, which will appear on the scope, from inside the controller code.
|
28412
|
+
* * Since there is always a `.` in the bindings, you don't have to worry about prototypal
|
28413
|
+
* inheritance masking primitives.
|
28414
|
+
*
|
28415
|
+
* This example demonstrates the `controller as` syntax.
|
28416
|
+
*
|
28417
|
+
* <example name="ngControllerAs">
|
28418
|
+
* <file name="index.html">
|
28419
|
+
* <div id="ctrl-as-exmpl" ng-controller="SettingsController1 as settings">
|
28420
|
+
* Name: <input type="text" ng-model="settings.name"/>
|
28421
|
+
* [ <a href="" ng-click="settings.greet()">greet</a> ]<br/>
|
28422
|
+
* Contact:
|
28423
|
+
* <ul>
|
28424
|
+
* <li ng-repeat="contact in settings.contacts">
|
28425
|
+
* <select ng-model="contact.type">
|
28426
|
+
* <option>phone</option>
|
28427
|
+
* <option>email</option>
|
28428
|
+
* </select>
|
28429
|
+
* <input type="text" ng-model="contact.value"/>
|
28430
|
+
* [ <a href="" ng-click="settings.clearContact(contact)">clear</a>
|
28431
|
+
* | <a href="" ng-click="settings.removeContact(contact)">X</a> ]
|
28432
|
+
* </li>
|
28433
|
+
* <li>[ <a href="" ng-click="settings.addContact()">add</a> ]</li>
|
28434
|
+
* </ul>
|
28435
|
+
* </div>
|
28436
|
+
* </file>
|
28437
|
+
* <file name="app.js">
|
28438
|
+
* function SettingsController1() {
|
28439
|
+
* this.name = "John Smith";
|
28440
|
+
* this.contacts = [
|
28441
|
+
* {type: 'phone', value: '408 555 1212'},
|
28442
|
+
* {type: 'email', value: 'john.smith@example.org'} ];
|
28443
|
+
* }
|
28444
|
+
*
|
28445
|
+
* SettingsController1.prototype.greet = function() {
|
28446
|
+
* alert(this.name);
|
28447
|
+
* };
|
28448
|
+
*
|
28449
|
+
* SettingsController1.prototype.addContact = function() {
|
28450
|
+
* this.contacts.push({type: 'email', value: 'yourname@example.org'});
|
28451
|
+
* };
|
28452
|
+
*
|
28453
|
+
* SettingsController1.prototype.removeContact = function(contactToRemove) {
|
28454
|
+
* var index = this.contacts.indexOf(contactToRemove);
|
28455
|
+
* this.contacts.splice(index, 1);
|
28456
|
+
* };
|
28457
|
+
*
|
28458
|
+
* SettingsController1.prototype.clearContact = function(contact) {
|
28459
|
+
* contact.type = 'phone';
|
28460
|
+
* contact.value = '';
|
28461
|
+
* };
|
28462
|
+
* </file>
|
28463
|
+
* <file name="protractor.js" type="protractor">
|
28464
|
+
* it('should check controller as', function() {
|
28465
|
+
* var container = element(by.id('ctrl-as-exmpl'));
|
28466
|
+
* expect(container.findElement(by.model('settings.name'))
|
28467
|
+
* .getAttribute('value')).toBe('John Smith');
|
28468
|
+
*
|
28469
|
+
* var firstRepeat =
|
28470
|
+
* container.findElement(by.repeater('contact in settings.contacts').row(0));
|
28471
|
+
* var secondRepeat =
|
28472
|
+
* container.findElement(by.repeater('contact in settings.contacts').row(1));
|
28473
|
+
*
|
28474
|
+
* expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28475
|
+
* .toBe('408 555 1212');
|
28476
|
+
*
|
28477
|
+
* expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28478
|
+
* .toBe('john.smith@example.org');
|
28479
|
+
*
|
28480
|
+
* firstRepeat.findElement(by.linkText('clear')).click();
|
28481
|
+
*
|
28482
|
+
* expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28483
|
+
* .toBe('');
|
28484
|
+
*
|
28485
|
+
* container.findElement(by.linkText('add')).click();
|
28486
|
+
*
|
28487
|
+
* expect(container.findElement(by.repeater('contact in settings.contacts').row(2))
|
28488
|
+
* .findElement(by.model('contact.value'))
|
28489
|
+
* .getAttribute('value'))
|
28490
|
+
* .toBe('yourname@example.org');
|
28491
|
+
* });
|
28492
|
+
* </file>
|
28493
|
+
* </example>
|
28494
|
+
*
|
28495
|
+
* This example demonstrates the "attach to `$scope`" style of controller.
|
28496
|
+
*
|
28497
|
+
* <example name="ngController">
|
28498
|
+
* <file name="index.html">
|
28499
|
+
* <div id="ctrl-exmpl" ng-controller="SettingsController2">
|
28500
|
+
* Name: <input type="text" ng-model="name"/>
|
28501
|
+
* [ <a href="" ng-click="greet()">greet</a> ]<br/>
|
28502
|
+
* Contact:
|
28503
|
+
* <ul>
|
28504
|
+
* <li ng-repeat="contact in contacts">
|
28505
|
+
* <select ng-model="contact.type">
|
28506
|
+
* <option>phone</option>
|
28507
|
+
* <option>email</option>
|
28508
|
+
* </select>
|
28509
|
+
* <input type="text" ng-model="contact.value"/>
|
28510
|
+
* [ <a href="" ng-click="clearContact(contact)">clear</a>
|
28511
|
+
* | <a href="" ng-click="removeContact(contact)">X</a> ]
|
28512
|
+
* </li>
|
28513
|
+
* <li>[ <a href="" ng-click="addContact()">add</a> ]</li>
|
28514
|
+
* </ul>
|
28515
|
+
* </div>
|
28516
|
+
* </file>
|
28517
|
+
* <file name="app.js">
|
28518
|
+
* function SettingsController2($scope) {
|
28519
|
+
* $scope.name = "John Smith";
|
28520
|
+
* $scope.contacts = [
|
28521
|
+
* {type:'phone', value:'408 555 1212'},
|
28522
|
+
* {type:'email', value:'john.smith@example.org'} ];
|
28523
|
+
*
|
28524
|
+
* $scope.greet = function() {
|
28525
|
+
* alert($scope.name);
|
28526
|
+
* };
|
28527
|
+
*
|
28528
|
+
* $scope.addContact = function() {
|
28529
|
+
* $scope.contacts.push({type:'email', value:'yourname@example.org'});
|
28530
|
+
* };
|
28531
|
+
*
|
28532
|
+
* $scope.removeContact = function(contactToRemove) {
|
28533
|
+
* var index = $scope.contacts.indexOf(contactToRemove);
|
28534
|
+
* $scope.contacts.splice(index, 1);
|
28535
|
+
* };
|
28536
|
+
*
|
28537
|
+
* $scope.clearContact = function(contact) {
|
28538
|
+
* contact.type = 'phone';
|
28539
|
+
* contact.value = '';
|
28540
|
+
* };
|
28541
|
+
* }
|
28542
|
+
* </file>
|
28543
|
+
* <file name="protractor.js" type="protractor">
|
28544
|
+
* it('should check controller', function() {
|
28545
|
+
* var container = element(by.id('ctrl-exmpl'));
|
28546
|
+
*
|
28547
|
+
* expect(container.findElement(by.model('name'))
|
28548
|
+
* .getAttribute('value')).toBe('John Smith');
|
28549
|
+
*
|
28550
|
+
* var firstRepeat =
|
28551
|
+
* container.findElement(by.repeater('contact in contacts').row(0));
|
28552
|
+
* var secondRepeat =
|
28553
|
+
* container.findElement(by.repeater('contact in contacts').row(1));
|
28554
|
+
*
|
28555
|
+
* expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28556
|
+
* .toBe('408 555 1212');
|
28557
|
+
* expect(secondRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28558
|
+
* .toBe('john.smith@example.org');
|
28559
|
+
*
|
28560
|
+
* firstRepeat.findElement(by.linkText('clear')).click();
|
28561
|
+
*
|
28562
|
+
* expect(firstRepeat.findElement(by.model('contact.value')).getAttribute('value'))
|
28563
|
+
* .toBe('');
|
28564
|
+
*
|
28565
|
+
* container.findElement(by.linkText('add')).click();
|
28566
|
+
*
|
28567
|
+
* expect(container.findElement(by.repeater('contact in contacts').row(2))
|
28568
|
+
* .findElement(by.model('contact.value'))
|
28569
|
+
* .getAttribute('value'))
|
28570
|
+
* .toBe('yourname@example.org');
|
28571
|
+
* });
|
28572
|
+
* </file>
|
28573
|
+
*</example>
|
28319
28574
|
|
28320
28575
|
*/
|
28321
28576
|
var ngControllerDirective = [function() {
|
@@ -28413,7 +28668,7 @@ forEach(
|
|
28413
28668
|
return {
|
28414
28669
|
compile: function($element, attr) {
|
28415
28670
|
var fn = $parse(attr[directiveName]);
|
28416
|
-
return function(scope, element
|
28671
|
+
return function ngEventHandler(scope, element) {
|
28417
28672
|
element.on(lowercase(name), function(event) {
|
28418
28673
|
scope.$apply(function() {
|
28419
28674
|
fn(scope, {$event:event});
|
@@ -28630,8 +28885,13 @@ forEach(
|
|
28630
28885
|
* @example
|
28631
28886
|
<example>
|
28632
28887
|
<file name="index.html">
|
28633
|
-
|
28634
|
-
|
28888
|
+
<p>Typing in the input box below updates the key count</p>
|
28889
|
+
<input ng-keyup="count = count + 1" ng-init="count=0"> key up count: {{count}}
|
28890
|
+
|
28891
|
+
<p>Typing in the input box below updates the keycode</p>
|
28892
|
+
<input ng-keyup="event=$event">
|
28893
|
+
<p>event keyCode: {{ event.keyCode }}</p>
|
28894
|
+
<p>event altKey: {{ event.altKey }}</p>
|
28635
28895
|
</file>
|
28636
28896
|
</example>
|
28637
28897
|
*/
|
@@ -28903,7 +29163,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
28903
29163
|
clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
|
28904
29164
|
// Note: We only need the first/last node of the cloned nodes.
|
28905
29165
|
// However, we need to keep the reference to the jqlite wrapper as it might be changed later
|
28906
|
-
// by a directive with templateUrl when
|
29166
|
+
// by a directive with templateUrl when its template arrives.
|
28907
29167
|
block = {
|
28908
29168
|
clone: clone
|
28909
29169
|
};
|
@@ -29602,7 +29862,7 @@ var ngPluralizeDirective = ['$locale', '$interpolate', function($locale, $interp
|
|
29602
29862
|
* mapped to the same DOM element, which is not possible.) Filters should be applied to the expression,
|
29603
29863
|
* before specifying a tracking expression.
|
29604
29864
|
*
|
29605
|
-
* For example: `item in items` is equivalent to `item in items track by $id(item)
|
29865
|
+
* For example: `item in items` is equivalent to `item in items track by $id(item)`. This implies that the DOM elements
|
29606
29866
|
* will be associated by item identity in the array.
|
29607
29867
|
*
|
29608
29868
|
* For example: `item in items track by $id(item)`. A built in `$id()` function can be used to assign a unique
|
@@ -29880,7 +30140,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29880
30140
|
block.scope = childScope;
|
29881
30141
|
// Note: We only need the first/last node of the cloned nodes.
|
29882
30142
|
// However, we need to keep the reference to the jqlite wrapper as it might be changed later
|
29883
|
-
// by a directive with templateUrl when
|
30143
|
+
// by a directive with templateUrl when its template arrives.
|
29884
30144
|
block.clone = clone;
|
29885
30145
|
nextBlockMap[block.id] = block;
|
29886
30146
|
});
|
@@ -29923,6 +30183,11 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29923
30183
|
* on the element causing it to become hidden. When true, the ng-hide CSS class is removed
|
29924
30184
|
* from the element causing the element not to appear hidden.
|
29925
30185
|
*
|
30186
|
+
* <div class="alert alert-warning">
|
30187
|
+
* **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />
|
30188
|
+
* "f" / "0" / "false" / "no" / "n" / "[]"
|
30189
|
+
* </div>
|
30190
|
+
*
|
29926
30191
|
* ## Why is !important used?
|
29927
30192
|
*
|
29928
30193
|
* You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
|
@@ -29936,26 +30201,21 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29936
30201
|
*
|
29937
30202
|
* ### Overriding .ng-hide
|
29938
30203
|
*
|
29939
|
-
*
|
29940
|
-
* restating the styles for the
|
30204
|
+
* By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
|
30205
|
+
* the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
|
30206
|
+
* class in CSS:
|
30207
|
+
*
|
29941
30208
|
* ```css
|
29942
30209
|
* .ng-hide {
|
29943
|
-
* //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
|
29944
|
-
* display:block!important;
|
29945
|
-
*
|
29946
30210
|
* //this is just another form of hiding an element
|
30211
|
+
* display:block!important;
|
29947
30212
|
* position:absolute;
|
29948
30213
|
* top:-9999px;
|
29949
30214
|
* left:-9999px;
|
29950
30215
|
* }
|
29951
30216
|
* ```
|
29952
30217
|
*
|
29953
|
-
*
|
29954
|
-
*
|
29955
|
-
* <div class="alert alert-warning">
|
29956
|
-
* **Note:** Here is a list of values that ngShow will consider as a falsy value (case insensitive):<br />
|
29957
|
-
* "f" / "0" / "false" / "no" / "n" / "[]"
|
29958
|
-
* </div>
|
30218
|
+
* By default you don't need to override in CSS anything and the animations will work around the display style.
|
29959
30219
|
*
|
29960
30220
|
* ## A note about animations with ngShow
|
29961
30221
|
*
|
@@ -29970,7 +30230,6 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29970
30230
|
* //
|
29971
30231
|
* .my-element.ng-hide-add, .my-element.ng-hide-remove {
|
29972
30232
|
* transition:0.5s linear all;
|
29973
|
-
* display:block!important;
|
29974
30233
|
* }
|
29975
30234
|
*
|
29976
30235
|
* .my-element.ng-hide-add { ... }
|
@@ -29979,6 +30238,9 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
29979
30238
|
* .my-element.ng-hide-remove.ng-hide-remove-active { ... }
|
29980
30239
|
* ```
|
29981
30240
|
*
|
30241
|
+
* Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display
|
30242
|
+
* property to block during animation states--ngAnimate will handle the style toggling automatically for you.
|
30243
|
+
*
|
29982
30244
|
* @animations
|
29983
30245
|
* addClass: .ng-hide - happens after the ngShow expression evaluates to a truthy value and the just before contents are set to visible
|
29984
30246
|
* removeClass: .ng-hide - happens after the ngShow expression evaluates to a non truthy value and just before the contents are set to hidden
|
@@ -30018,11 +30280,6 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
30018
30280
|
background:white;
|
30019
30281
|
}
|
30020
30282
|
|
30021
|
-
.animate-show.ng-hide-add,
|
30022
|
-
.animate-show.ng-hide-remove {
|
30023
|
-
display:block!important;
|
30024
|
-
}
|
30025
|
-
|
30026
30283
|
.animate-show.ng-hide {
|
30027
30284
|
line-height:0;
|
30028
30285
|
opacity:0;
|
@@ -30073,16 +30330,21 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
30073
30330
|
*
|
30074
30331
|
* ```html
|
30075
30332
|
* <!-- when $scope.myValue is truthy (element is hidden) -->
|
30076
|
-
* <div ng-hide="myValue"></div>
|
30333
|
+
* <div ng-hide="myValue" class="ng-hide"></div>
|
30077
30334
|
*
|
30078
30335
|
* <!-- when $scope.myValue is falsy (element is visible) -->
|
30079
|
-
* <div ng-hide="myValue"
|
30336
|
+
* <div ng-hide="myValue"></div>
|
30080
30337
|
* ```
|
30081
30338
|
*
|
30082
30339
|
* When the ngHide expression evaluates to true then the .ng-hide CSS class is added to the class attribute
|
30083
30340
|
* on the element causing it to become hidden. When false, the ng-hide CSS class is removed
|
30084
30341
|
* from the element causing the element not to appear hidden.
|
30085
30342
|
*
|
30343
|
+
* <div class="alert alert-warning">
|
30344
|
+
* **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />
|
30345
|
+
* "f" / "0" / "false" / "no" / "n" / "[]"
|
30346
|
+
* </div>
|
30347
|
+
*
|
30086
30348
|
* ## Why is !important used?
|
30087
30349
|
*
|
30088
30350
|
* You may be wondering why !important is used for the .ng-hide CSS class. This is because the `.ng-hide` selector
|
@@ -30096,33 +30358,27 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
30096
30358
|
*
|
30097
30359
|
* ### Overriding .ng-hide
|
30098
30360
|
*
|
30099
|
-
*
|
30100
|
-
* restating the styles for the
|
30361
|
+
* By default, the `.ng-hide` class will style the element with `display:none!important`. If you wish to change
|
30362
|
+
* the hide behavior with ngShow/ngHide then this can be achieved by restating the styles for the `.ng-hide`
|
30363
|
+
* class in CSS:
|
30364
|
+
*
|
30101
30365
|
* ```css
|
30102
30366
|
* .ng-hide {
|
30103
|
-
* //!annotate CSS Specificity|Not to worry, this will override the AngularJS default...
|
30104
|
-
* display:block!important;
|
30105
|
-
*
|
30106
30367
|
* //this is just another form of hiding an element
|
30368
|
+
* display:block!important;
|
30107
30369
|
* position:absolute;
|
30108
30370
|
* top:-9999px;
|
30109
30371
|
* left:-9999px;
|
30110
30372
|
* }
|
30111
30373
|
* ```
|
30112
30374
|
*
|
30113
|
-
*
|
30114
|
-
*
|
30115
|
-
* <div class="alert alert-warning">
|
30116
|
-
* **Note:** Here is a list of values that ngHide will consider as a falsy value (case insensitive):<br />
|
30117
|
-
* "f" / "0" / "false" / "no" / "n" / "[]"
|
30118
|
-
* </div>
|
30375
|
+
* By default you don't need to override in CSS anything and the animations will work around the display style.
|
30119
30376
|
*
|
30120
30377
|
* ## A note about animations with ngHide
|
30121
30378
|
*
|
30122
30379
|
* Animations in ngShow/ngHide work with the show and hide events that are triggered when the directive expression
|
30123
|
-
* is true and false. This system works like the animation system present with ngClass, except that
|
30124
|
-
*
|
30125
|
-
* that you can perform an animation when the element is hidden during the time of the animation.
|
30380
|
+
* is true and false. This system works like the animation system present with ngClass, except that the `.ng-hide`
|
30381
|
+
* CSS class is added and removed for you instead of your own CSS class.
|
30126
30382
|
*
|
30127
30383
|
* ```css
|
30128
30384
|
* //
|
@@ -30130,7 +30386,6 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
30130
30386
|
* //
|
30131
30387
|
* .my-element.ng-hide-add, .my-element.ng-hide-remove {
|
30132
30388
|
* transition:0.5s linear all;
|
30133
|
-
* display:block!important;
|
30134
30389
|
* }
|
30135
30390
|
*
|
30136
30391
|
* .my-element.ng-hide-add { ... }
|
@@ -30139,6 +30394,9 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
30139
30394
|
* .my-element.ng-hide-remove.ng-hide-remove-active { ... }
|
30140
30395
|
* ```
|
30141
30396
|
*
|
30397
|
+
* Keep in mind that, as of AngularJS version 1.2.17 (and 1.3.0-beta.11), there is no need to change the display
|
30398
|
+
* property to block during animation states--ngAnimate will handle the style toggling automatically for you.
|
30399
|
+
*
|
30142
30400
|
* @animations
|
30143
30401
|
* removeClass: .ng-hide - happens after the ngHide expression evaluates to a truthy value and just before the contents are set to hidden
|
30144
30402
|
* addClass: .ng-hide - happens after the ngHide expression evaluates to a non truthy value and just before the contents are set to visible
|
@@ -30178,11 +30436,6 @@ var ngShowDirective = ['$animate', function($animate) {
|
|
30178
30436
|
background:white;
|
30179
30437
|
}
|
30180
30438
|
|
30181
|
-
.animate-hide.ng-hide-add,
|
30182
|
-
.animate-hide.ng-hide-remove {
|
30183
|
-
display:block!important;
|
30184
|
-
}
|
30185
|
-
|
30186
30439
|
.animate-hide.ng-hide {
|
30187
30440
|
line-height:0;
|
30188
30441
|
opacity:0;
|
@@ -30228,14 +30481,20 @@ var ngHideDirective = ['$animate', function($animate) {
|
|
30228
30481
|
* The `ngStyle` directive allows you to set CSS style on an HTML element conditionally.
|
30229
30482
|
*
|
30230
30483
|
* @element ANY
|
30231
|
-
* @param {expression} ngStyle
|
30232
|
-
*
|
30233
|
-
*
|
30484
|
+
* @param {expression} ngStyle
|
30485
|
+
*
|
30486
|
+
* {@link guide/expression Expression} which evals to an
|
30487
|
+
* object whose keys are CSS style names and values are corresponding values for those CSS
|
30488
|
+
* keys.
|
30489
|
+
*
|
30490
|
+
* Since some CSS style names are not valid keys for an object, they must be quoted.
|
30491
|
+
* See the 'background-color' style in the example below.
|
30234
30492
|
*
|
30235
30493
|
* @example
|
30236
30494
|
<example>
|
30237
30495
|
<file name="index.html">
|
30238
|
-
<input type="button" value="set" ng-click="myStyle={color:'red'}">
|
30496
|
+
<input type="button" value="set color" ng-click="myStyle={color:'red'}">
|
30497
|
+
<input type="button" value="set background" ng-click="myStyle={'background-color':'blue'}">
|
30239
30498
|
<input type="button" value="clear" ng-click="myStyle={}">
|
30240
30499
|
<br/>
|
30241
30500
|
<span ng-style="myStyle">Sample Text</span>
|
@@ -30249,9 +30508,9 @@ var ngHideDirective = ['$animate', function($animate) {
|
|
30249
30508
|
<file name="protractor.js" type="protractor">
|
30250
30509
|
var colorSpan = element(by.css('span'));
|
30251
30510
|
|
30252
|
-
|
30511
|
+
iit('should check ng-style', function() {
|
30253
30512
|
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
30254
|
-
element(by.css('input[value
|
30513
|
+
element(by.css('input[value=\'set color\']')).click();
|
30255
30514
|
expect(colorSpan.getCssValue('color')).toBe('rgba(255, 0, 0, 1)');
|
30256
30515
|
element(by.css('input[value=clear]')).click();
|
30257
30516
|
expect(colorSpan.getCssValue('color')).toBe('rgba(0, 0, 0, 1)');
|
@@ -30299,11 +30558,14 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
30299
30558
|
* leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
|
30300
30559
|
*
|
30301
30560
|
* @usage
|
30561
|
+
*
|
30562
|
+
* ```
|
30302
30563
|
* <ANY ng-switch="expression">
|
30303
30564
|
* <ANY ng-switch-when="matchValue1">...</ANY>
|
30304
30565
|
* <ANY ng-switch-when="matchValue2">...</ANY>
|
30305
30566
|
* <ANY ng-switch-default>...</ANY>
|
30306
30567
|
* </ANY>
|
30568
|
+
* ```
|
30307
30569
|
*
|
30308
30570
|
*
|
30309
30571
|
* @scope
|
@@ -30403,37 +30665,29 @@ var ngSwitchDirective = ['$animate', function($animate) {
|
|
30403
30665
|
}],
|
30404
30666
|
link: function(scope, element, attr, ngSwitchController) {
|
30405
30667
|
var watchExpr = attr.ngSwitch || attr.on,
|
30406
|
-
selectedTranscludes,
|
30407
|
-
selectedElements,
|
30408
|
-
previousElements,
|
30668
|
+
selectedTranscludes = [],
|
30669
|
+
selectedElements = [],
|
30670
|
+
previousElements = [],
|
30409
30671
|
selectedScopes = [];
|
30410
30672
|
|
30411
30673
|
scope.$watch(watchExpr, function ngSwitchWatchAction(value) {
|
30412
|
-
var i, ii
|
30413
|
-
|
30414
|
-
|
30415
|
-
|
30416
|
-
|
30417
|
-
|
30418
|
-
|
30419
|
-
|
30420
|
-
|
30421
|
-
previousElements =
|
30422
|
-
|
30423
|
-
|
30424
|
-
|
30425
|
-
previousElements[i] = selected;
|
30426
|
-
$animate.leave(selected, function() {
|
30427
|
-
previousElements.splice(i, 1);
|
30428
|
-
if(previousElements.length === 0) {
|
30429
|
-
previousElements = null;
|
30430
|
-
}
|
30431
|
-
});
|
30432
|
-
}
|
30674
|
+
var i, ii;
|
30675
|
+
for (i = 0, ii = previousElements.length; i < ii; ++i) {
|
30676
|
+
previousElements[i].remove();
|
30677
|
+
}
|
30678
|
+
previousElements.length = 0;
|
30679
|
+
|
30680
|
+
for (i = 0, ii = selectedScopes.length; i < ii; ++i) {
|
30681
|
+
var selected = selectedElements[i];
|
30682
|
+
selectedScopes[i].$destroy();
|
30683
|
+
previousElements[i] = selected;
|
30684
|
+
$animate.leave(selected, function() {
|
30685
|
+
previousElements.splice(i, 1);
|
30686
|
+
});
|
30433
30687
|
}
|
30434
30688
|
|
30435
|
-
selectedElements =
|
30436
|
-
selectedScopes =
|
30689
|
+
selectedElements.length = 0;
|
30690
|
+
selectedScopes.length = 0;
|
30437
30691
|
|
30438
30692
|
if ((selectedTranscludes = ngSwitchController.cases['!' + value] || ngSwitchController.cases['?'])) {
|
30439
30693
|
scope.$eval(attr.change);
|
@@ -30677,7 +30931,7 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
30677
30931
|
{name:'blue', shade:'dark'},
|
30678
30932
|
{name:'yellow', shade:'light'}
|
30679
30933
|
];
|
30680
|
-
$scope.
|
30934
|
+
$scope.myColor = $scope.colors[2]; // red
|
30681
30935
|
}
|
30682
30936
|
</script>
|
30683
30937
|
<div ng-controller="MyCntrl">
|
@@ -30692,37 +30946,37 @@ var ngOptionsMinErr = minErr('ngOptions');
|
|
30692
30946
|
</ul>
|
30693
30947
|
<hr/>
|
30694
30948
|
Color (null not allowed):
|
30695
|
-
<select ng-model="
|
30949
|
+
<select ng-model="myColor" ng-options="color.name for color in colors"></select><br>
|
30696
30950
|
|
30697
30951
|
Color (null allowed):
|
30698
30952
|
<span class="nullable">
|
30699
|
-
<select ng-model="
|
30953
|
+
<select ng-model="myColor" ng-options="color.name for color in colors">
|
30700
30954
|
<option value="">-- choose color --</option>
|
30701
30955
|
</select>
|
30702
30956
|
</span><br/>
|
30703
30957
|
|
30704
30958
|
Color grouped by shade:
|
30705
|
-
<select ng-model="
|
30959
|
+
<select ng-model="myColor" ng-options="color.name group by color.shade for color in colors">
|
30706
30960
|
</select><br/>
|
30707
30961
|
|
30708
30962
|
|
30709
|
-
Select <a href ng-click="
|
30963
|
+
Select <a href ng-click="myColor = { name:'not in list', shade: 'other' }">bogus</a>.<br>
|
30710
30964
|
<hr/>
|
30711
|
-
Currently selected: {{ {selected_color:
|
30965
|
+
Currently selected: {{ {selected_color:myColor} }}
|
30712
30966
|
<div style="border:solid 1px black; height:20px"
|
30713
|
-
ng-style="{'background-color':
|
30967
|
+
ng-style="{'background-color':myColor.name}">
|
30714
30968
|
</div>
|
30715
30969
|
</div>
|
30716
30970
|
</file>
|
30717
30971
|
<file name="protractor.js" type="protractor">
|
30718
30972
|
it('should check ng-options', function() {
|
30719
|
-
expect(element(by.binding('{selected_color:
|
30720
|
-
element.all(by.select('
|
30721
|
-
element.all(by.css('select[ng-model="
|
30722
|
-
expect(element(by.binding('{selected_color:
|
30723
|
-
element(by.css('.nullable select[ng-model="
|
30724
|
-
element.all(by.css('.nullable select[ng-model="
|
30725
|
-
expect(element(by.binding('{selected_color:
|
30973
|
+
expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('red');
|
30974
|
+
element.all(by.select('myColor')).first().click();
|
30975
|
+
element.all(by.css('select[ng-model="myColor"] option')).first().click();
|
30976
|
+
expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('black');
|
30977
|
+
element(by.css('.nullable select[ng-model="myColor"]')).click();
|
30978
|
+
element.all(by.css('.nullable select[ng-model="myColor"] option')).first().click();
|
30979
|
+
expect(element(by.binding('{selected_color:myColor}')).getText()).toMatch('null');
|
30726
30980
|
});
|
30727
30981
|
</file>
|
30728
30982
|
</example>
|
@@ -30877,7 +31131,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
30877
31131
|
// we need to work of an array, so we need to see if anything was inserted/removed
|
30878
31132
|
scope.$watch(function selectMultipleWatch() {
|
30879
31133
|
if (!equals(lastView, ctrl.$viewValue)) {
|
30880
|
-
lastView =
|
31134
|
+
lastView = shallowCopy(ctrl.$viewValue);
|
30881
31135
|
ctrl.$render();
|
30882
31136
|
}
|
30883
31137
|
});
|
@@ -32036,7 +32290,7 @@ angular.scenario.Future.prototype.execute = function(doneFn) {
|
|
32036
32290
|
};
|
32037
32291
|
|
32038
32292
|
/**
|
32039
|
-
* Configures the future to convert
|
32293
|
+
* Configures the future to convert its final with a function fn(value)
|
32040
32294
|
*
|
32041
32295
|
* @param {function()} fn function(value) that returns the parsed value
|
32042
32296
|
*/
|
@@ -32046,7 +32300,7 @@ angular.scenario.Future.prototype.parsedWith = function(fn) {
|
|
32046
32300
|
};
|
32047
32301
|
|
32048
32302
|
/**
|
32049
|
-
* Configures the future to parse
|
32303
|
+
* Configures the future to parse its final value from JSON
|
32050
32304
|
* into objects.
|
32051
32305
|
*/
|
32052
32306
|
angular.scenario.Future.prototype.fromJson = function() {
|
@@ -32054,7 +32308,7 @@ angular.scenario.Future.prototype.fromJson = function() {
|
|
32054
32308
|
};
|
32055
32309
|
|
32056
32310
|
/**
|
32057
|
-
* Configures the future to convert
|
32311
|
+
* Configures the future to convert its final value from objects
|
32058
32312
|
* into JSON.
|
32059
32313
|
*/
|
32060
32314
|
angular.scenario.Future.prototype.toJson = function() {
|
@@ -33460,5 +33714,5 @@ if (config.autotest) {
|
|
33460
33714
|
})(window, document);
|
33461
33715
|
|
33462
33716
|
|
33463
|
-
!angular.$$csp() && angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak,\n.ng-hide {\n display: none !important;\n}\n\nng\\:form {\n display: block;\n}\n\n.ng-animate-block-transitions {\n transition:0s all!important;\n -webkit-transition:0s all!important;\n}\n</style>');
|
33464
|
-
!angular.$$csp() && angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";\n/* CSS Document */\n\n/** Structure */\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n font-size: 14px;\n}\n\n#system-error {\n font-size: 1.5em;\n text-align: center;\n}\n\n#json, #xml {\n display: none;\n}\n\n#header {\n position: fixed;\n width: 100%;\n}\n\n#specs {\n padding-top: 50px;\n}\n\n#header .angular {\n font-family: Courier New, monospace;\n font-weight: bold;\n}\n\n#header h1 {\n font-weight: normal;\n float: left;\n font-size: 30px;\n line-height: 30px;\n margin: 0;\n padding: 10px 10px;\n height: 30px;\n}\n\n#application h2,\n#specs h2 {\n margin: 0;\n padding: 0.5em;\n font-size: 1.1em;\n}\n\n#status-legend {\n margin-top: 10px;\n margin-right: 10px;\n}\n\n#header,\n#application,\n.test-info,\n.test-actions li {\n overflow: hidden;\n}\n\n#application {\n margin: 10px;\n}\n\n#application iframe {\n width: 100%;\n height: 758px;\n}\n\n#application .popout {\n float: right;\n}\n\n#application iframe {\n border: none;\n}\n\n.tests li,\n.test-actions li,\n.test-it li,\n.test-it ol,\n.status-display {\n list-style-type: none;\n}\n\n.tests,\n.test-it ol,\n.status-display {\n margin: 0;\n padding: 0;\n}\n\n.test-info {\n margin-left: 1em;\n margin-top: 0.5em;\n border-radius: 8px 0 0 8px;\n -webkit-border-radius: 8px 0 0 8px;\n -moz-border-radius: 8px 0 0 8px;\n cursor: pointer;\n}\n\n.test-info:hover .test-name {\n text-decoration: underline;\n}\n\n.test-info .closed:before {\n content: \'\\25b8\\00A0\';\n}\n\n.test-info .open:before {\n content: \'\\25be\\00A0\';\n font-weight: bold;\n}\n\n.test-it ol {\n margin-left: 2.5em;\n}\n\n.status-display,\n.status-display li {\n float: right;\n}\n\n.status-display li {\n padding: 5px 10px;\n}\n\n.timer-result,\n.test-title {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.test-actions .test-title,\n.test-actions .test-result {\n display: table-cell;\n padding-left: 0.5em;\n padding-right: 0.5em;\n}\n\n.test-actions {\n display: table;\n}\n\n.test-actions li {\n display: table-row;\n}\n\n.timer-result {\n width: 4em;\n padding: 0 10px;\n text-align: right;\n font-family: monospace;\n}\n\n.test-it pre,\n.test-actions pre {\n clear: left;\n color: black;\n margin-left: 6em;\n}\n\n.test-describe {\n padding-bottom: 0.5em;\n}\n\n.test-describe .test-describe {\n margin: 5px 5px 10px 2em;\n}\n\n.test-actions .status-pending .test-title:before {\n content: \'\\00bb\\00A0\';\n}\n\n.scrollpane {\n max-height: 20em;\n overflow: auto;\n}\n\n/** Colors */\n\n#header {\n background-color: #F2C200;\n}\n\n#specs h2 {\n border-top: 2px solid #BABAD1;\n}\n\n#specs h2,\n#application h2 {\n background-color: #efefef;\n}\n\n#application {\n border: 1px solid #BABAD1;\n}\n\n.test-describe .test-describe {\n border-left: 1px solid #BABAD1;\n border-right: 1px solid #BABAD1;\n border-bottom: 1px solid #BABAD1;\n}\n\n.status-display {\n border: 1px solid #777;\n}\n\n.status-display .status-pending,\n.status-pending .test-info {\n background-color: #F9EEBC;\n}\n\n.status-display .status-success,\n.status-success .test-info {\n background-color: #B1D7A1;\n}\n\n.status-display .status-failure,\n.status-failure .test-info {\n background-color: #FF8286;\n}\n\n.status-display .status-error,\n.status-error .test-info {\n background-color: black;\n color: white;\n}\n\n.test-actions .status-success .test-title {\n color: #30B30A;\n}\n\n.test-actions .status-failure .test-title {\n color: #DF0000;\n}\n\n.test-actions .status-error .test-title {\n color: black;\n}\n\n.test-actions .timer-result {\n color: #888;\n}\n</style>');
|
33717
|
+
!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";\n\n[ng\\:cloak], [ng-cloak], [data-ng-cloak], [x-ng-cloak],\n.ng-cloak, .x-ng-cloak,\n.ng-hide {\n display: none !important;\n}\n\nng\\:form {\n display: block;\n}\n\n.ng-animate-block-transitions {\n transition:0s all!important;\n -webkit-transition:0s all!important;\n}\n\n/* show the element during a show/hide animation when the\n * animation is ongoing, but the .ng-hide class is active */\n.ng-hide-add-active, .ng-hide-remove {\n display: block!important;\n}\n</style>');
|
33718
|
+
!window.angular.$$csp() && window.angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";\n/* CSS Document */\n\n/** Structure */\nbody {\n font-family: Arial, sans-serif;\n margin: 0;\n font-size: 14px;\n}\n\n#system-error {\n font-size: 1.5em;\n text-align: center;\n}\n\n#json, #xml {\n display: none;\n}\n\n#header {\n position: fixed;\n width: 100%;\n}\n\n#specs {\n padding-top: 50px;\n}\n\n#header .angular {\n font-family: Courier New, monospace;\n font-weight: bold;\n}\n\n#header h1 {\n font-weight: normal;\n float: left;\n font-size: 30px;\n line-height: 30px;\n margin: 0;\n padding: 10px 10px;\n height: 30px;\n}\n\n#application h2,\n#specs h2 {\n margin: 0;\n padding: 0.5em;\n font-size: 1.1em;\n}\n\n#status-legend {\n margin-top: 10px;\n margin-right: 10px;\n}\n\n#header,\n#application,\n.test-info,\n.test-actions li {\n overflow: hidden;\n}\n\n#application {\n margin: 10px;\n}\n\n#application iframe {\n width: 100%;\n height: 758px;\n}\n\n#application .popout {\n float: right;\n}\n\n#application iframe {\n border: none;\n}\n\n.tests li,\n.test-actions li,\n.test-it li,\n.test-it ol,\n.status-display {\n list-style-type: none;\n}\n\n.tests,\n.test-it ol,\n.status-display {\n margin: 0;\n padding: 0;\n}\n\n.test-info {\n margin-left: 1em;\n margin-top: 0.5em;\n border-radius: 8px 0 0 8px;\n -webkit-border-radius: 8px 0 0 8px;\n -moz-border-radius: 8px 0 0 8px;\n cursor: pointer;\n}\n\n.test-info:hover .test-name {\n text-decoration: underline;\n}\n\n.test-info .closed:before {\n content: \'\\25b8\\00A0\';\n}\n\n.test-info .open:before {\n content: \'\\25be\\00A0\';\n font-weight: bold;\n}\n\n.test-it ol {\n margin-left: 2.5em;\n}\n\n.status-display,\n.status-display li {\n float: right;\n}\n\n.status-display li {\n padding: 5px 10px;\n}\n\n.timer-result,\n.test-title {\n display: inline-block;\n margin: 0;\n padding: 4px;\n}\n\n.test-actions .test-title,\n.test-actions .test-result {\n display: table-cell;\n padding-left: 0.5em;\n padding-right: 0.5em;\n}\n\n.test-actions {\n display: table;\n}\n\n.test-actions li {\n display: table-row;\n}\n\n.timer-result {\n width: 4em;\n padding: 0 10px;\n text-align: right;\n font-family: monospace;\n}\n\n.test-it pre,\n.test-actions pre {\n clear: left;\n color: black;\n margin-left: 6em;\n}\n\n.test-describe {\n padding-bottom: 0.5em;\n}\n\n.test-describe .test-describe {\n margin: 5px 5px 10px 2em;\n}\n\n.test-actions .status-pending .test-title:before {\n content: \'\\00bb\\00A0\';\n}\n\n.scrollpane {\n max-height: 20em;\n overflow: auto;\n}\n\n/** Colors */\n\n#header {\n background-color: #F2C200;\n}\n\n#specs h2 {\n border-top: 2px solid #BABAD1;\n}\n\n#specs h2,\n#application h2 {\n background-color: #efefef;\n}\n\n#application {\n border: 1px solid #BABAD1;\n}\n\n.test-describe .test-describe {\n border-left: 1px solid #BABAD1;\n border-right: 1px solid #BABAD1;\n border-bottom: 1px solid #BABAD1;\n}\n\n.status-display {\n border: 1px solid #777;\n}\n\n.status-display .status-pending,\n.status-pending .test-info {\n background-color: #F9EEBC;\n}\n\n.status-display .status-success,\n.status-success .test-info {\n background-color: #B1D7A1;\n}\n\n.status-display .status-failure,\n.status-failure .test-info {\n background-color: #FF8286;\n}\n\n.status-display .status-error,\n.status-error .test-info {\n background-color: black;\n color: white;\n}\n\n.test-actions .status-success .test-title {\n color: #30B30A;\n}\n\n.test-actions .status-failure .test-title {\n color: #DF0000;\n}\n\n.test-actions .status-error .test-title {\n color: black;\n}\n\n.test-actions .timer-result {\n color: #888;\n}\n</style>');
|