angular-rails-engine 1.2.3.0 → 1.2.5.0
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
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/app/assets/javascripts/angular/angular-animate.js +56 -27
- data/app/assets/javascripts/angular/angular-animate.min.js +18 -18
- data/app/assets/javascripts/angular/angular-cookies.js +1 -1
- data/app/assets/javascripts/angular/angular-cookies.min.js +1 -2
- data/app/assets/javascripts/angular/angular-loader.js +2 -2
- data/app/assets/javascripts/angular/angular-loader.min.js +2 -3
- data/app/assets/javascripts/angular/angular-mocks.js +4 -3
- data/app/assets/javascripts/angular/angular-resource.js +23 -4
- data/app/assets/javascripts/angular/angular-resource.min.js +8 -8
- data/app/assets/javascripts/angular/angular-route.js +52 -32
- data/app/assets/javascripts/angular/angular-route.min.js +9 -10
- data/app/assets/javascripts/angular/angular-sanitize.js +18 -11
- data/app/assets/javascripts/angular/angular-sanitize.min.js +9 -10
- data/app/assets/javascripts/angular/angular-scenario.js +302 -215
- data/app/assets/javascripts/angular/angular-touch.js +1 -1
- data/app/assets/javascripts/angular/angular-touch.min.js +1 -2
- data/app/assets/javascripts/angular/angular.js +302 -215
- data/app/assets/javascripts/angular/angular.min.js +196 -197
- data/lib/angular-rails-engine.rb +1 -1
- data/lib/angular-rails-engine/version.rb +1 -1
- metadata +2 -2
- metadata.gz.sig +0 -0
@@ -1,5 +1,5 @@
|
|
1
1
|
/*
|
2
|
-
AngularJS v1.2.
|
2
|
+
AngularJS v1.2.5
|
3
3
|
(c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
License: MIT
|
5
5
|
*/
|
@@ -10,4 +10,3 @@ a.touches&&a.touches.length?a.touches:[a],b=c[0].clientX,c=c[0].clientY;1>b&&1>c
|
|
10
10
|
function(a){q=!0;s=a.target?a.target:a.srcElement;3==s.nodeType&&(s=s.parentNode);c.addClass(p);t=Date.now();a=a.touches&&a.touches.length?a.touches:[a];a=a[0].originalEvent||a[0];w=a.clientX;x=a.clientY});c.on("touchmove",function(a){f()});c.on("touchcancel",function(a){f()});c.on("touchend",function(a){var h=Date.now()-t,e=a.changedTouches&&a.changedTouches.length?a.changedTouches:a.touches&&a.touches.length?a.touches:[a],g=e[0].originalEvent||e[0],e=g.clientX,g=g.clientY,p=Math.sqrt(Math.pow(e-
|
11
11
|
w,2)+Math.pow(g-x,2));q&&(750>h&&12>p)&&(k||(b[0].addEventListener("click",n,!0),b[0].addEventListener("touchstart",r,!0),k=[]),m=Date.now(),l(k,e,g),s&&s.blur(),v.isDefined(d.disabled)&&!1!==d.disabled||c.triggerHandler("click",[a]));f()});c.onclick=function(a){};c.on("click",function(b,c){a.$apply(function(){h(a,{$event:c||b})})});c.on("mousedown",function(a){c.addClass(p)});c.on("mousemove mouseup",function(a){c.removeClass(p)})}}]);t("ngSwipeLeft",-1,"swipeleft");t("ngSwipeRight",1,"swiperight")})(window,
|
12
12
|
window.angular);
|
13
|
-
//# sourceMappingURL=angular-touch.min.js.map
|
@@ -1,5 +1,5 @@
|
|
1
1
|
/**
|
2
|
-
* @license AngularJS v1.2.
|
2
|
+
* @license AngularJS v1.2.5
|
3
3
|
* (c) 2010-2014 Google, Inc. http://angularjs.org
|
4
4
|
* License: MIT
|
5
5
|
*/
|
@@ -68,7 +68,7 @@ function minErr(module) {
|
|
68
68
|
return match;
|
69
69
|
});
|
70
70
|
|
71
|
-
message = message + '\nhttp://errors.angularjs.org/1.2.
|
71
|
+
message = message + '\nhttp://errors.angularjs.org/1.2.5/' +
|
72
72
|
(module ? module + '/' : '') + code;
|
73
73
|
for (i = 2; i < arguments.length; i++) {
|
74
74
|
message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
|
@@ -472,7 +472,7 @@ function valueFn(value) {return function() {return value;};}
|
|
472
472
|
* @param {*} value Reference to check.
|
473
473
|
* @returns {boolean} True if `value` is undefined.
|
474
474
|
*/
|
475
|
-
function isUndefined(value){return typeof value
|
475
|
+
function isUndefined(value){return typeof value === 'undefined';}
|
476
476
|
|
477
477
|
|
478
478
|
/**
|
@@ -486,7 +486,7 @@ function isUndefined(value){return typeof value == 'undefined';}
|
|
486
486
|
* @param {*} value Reference to check.
|
487
487
|
* @returns {boolean} True if `value` is defined.
|
488
488
|
*/
|
489
|
-
function isDefined(value){return typeof value
|
489
|
+
function isDefined(value){return typeof value !== 'undefined';}
|
490
490
|
|
491
491
|
|
492
492
|
/**
|
@@ -501,7 +501,7 @@ function isDefined(value){return typeof value != 'undefined';}
|
|
501
501
|
* @param {*} value Reference to check.
|
502
502
|
* @returns {boolean} True if `value` is an `Object` but not `null`.
|
503
503
|
*/
|
504
|
-
function isObject(value){return value != null && typeof value
|
504
|
+
function isObject(value){return value != null && typeof value === 'object';}
|
505
505
|
|
506
506
|
|
507
507
|
/**
|
@@ -515,7 +515,7 @@ function isObject(value){return value != null && typeof value == 'object';}
|
|
515
515
|
* @param {*} value Reference to check.
|
516
516
|
* @returns {boolean} True if `value` is a `String`.
|
517
517
|
*/
|
518
|
-
function isString(value){return typeof value
|
518
|
+
function isString(value){return typeof value === 'string';}
|
519
519
|
|
520
520
|
|
521
521
|
/**
|
@@ -529,7 +529,7 @@ function isString(value){return typeof value == 'string';}
|
|
529
529
|
* @param {*} value Reference to check.
|
530
530
|
* @returns {boolean} True if `value` is a `Number`.
|
531
531
|
*/
|
532
|
-
function isNumber(value){return typeof value
|
532
|
+
function isNumber(value){return typeof value === 'number';}
|
533
533
|
|
534
534
|
|
535
535
|
/**
|
@@ -544,7 +544,7 @@ function isNumber(value){return typeof value == 'number';}
|
|
544
544
|
* @returns {boolean} True if `value` is a `Date`.
|
545
545
|
*/
|
546
546
|
function isDate(value){
|
547
|
-
return toString.
|
547
|
+
return toString.call(value) === '[object Date]';
|
548
548
|
}
|
549
549
|
|
550
550
|
|
@@ -560,7 +560,7 @@ function isDate(value){
|
|
560
560
|
* @returns {boolean} True if `value` is an `Array`.
|
561
561
|
*/
|
562
562
|
function isArray(value) {
|
563
|
-
return toString.
|
563
|
+
return toString.call(value) === '[object Array]';
|
564
564
|
}
|
565
565
|
|
566
566
|
|
@@ -575,7 +575,7 @@ function isArray(value) {
|
|
575
575
|
* @param {*} value Reference to check.
|
576
576
|
* @returns {boolean} True if `value` is a `Function`.
|
577
577
|
*/
|
578
|
-
function isFunction(value){return typeof value
|
578
|
+
function isFunction(value){return typeof value === 'function';}
|
579
579
|
|
580
580
|
|
581
581
|
/**
|
@@ -586,7 +586,7 @@ function isFunction(value){return typeof value == 'function';}
|
|
586
586
|
* @returns {boolean} True if `value` is a `RegExp`.
|
587
587
|
*/
|
588
588
|
function isRegExp(value) {
|
589
|
-
return toString.
|
589
|
+
return toString.call(value) === '[object RegExp]';
|
590
590
|
}
|
591
591
|
|
592
592
|
|
@@ -608,12 +608,12 @@ function isScope(obj) {
|
|
608
608
|
|
609
609
|
|
610
610
|
function isFile(obj) {
|
611
|
-
return toString.
|
611
|
+
return toString.call(obj) === '[object File]';
|
612
612
|
}
|
613
613
|
|
614
614
|
|
615
615
|
function isBoolean(value) {
|
616
|
-
return typeof value
|
616
|
+
return typeof value === 'boolean';
|
617
617
|
}
|
618
618
|
|
619
619
|
|
@@ -644,9 +644,9 @@ var trim = (function() {
|
|
644
644
|
* @returns {boolean} True if `value` is a DOM element (or wrapped jQuery element).
|
645
645
|
*/
|
646
646
|
function isElement(node) {
|
647
|
-
return node &&
|
647
|
+
return !!(node &&
|
648
648
|
(node.nodeName // we are a direct element
|
649
|
-
|| (node.on && node.find)); // we have an on and find method part of jQuery API
|
649
|
+
|| (node.on && node.find))); // we have an on and find method part of jQuery API
|
650
650
|
}
|
651
651
|
|
652
652
|
/**
|
@@ -717,7 +717,7 @@ function includes(array, obj) {
|
|
717
717
|
function indexOf(array, obj) {
|
718
718
|
if (array.indexOf) return array.indexOf(obj);
|
719
719
|
|
720
|
-
for (
|
720
|
+
for (var i = 0; i < array.length; i++) {
|
721
721
|
if (obj === array[i]) return i;
|
722
722
|
}
|
723
723
|
return -1;
|
@@ -847,7 +847,7 @@ function shallowCopy(src, dst) {
|
|
847
847
|
|
848
848
|
for(var key in src) {
|
849
849
|
// shallowCopy is only ever called by $compile nodeLinkFn, which has control over src
|
850
|
-
// so we don't need to worry hasOwnProperty here
|
850
|
+
// so we don't need to worry about using our custom hasOwnProperty here
|
851
851
|
if (src.hasOwnProperty(key) && key.substr(0, 2) !== '$$') {
|
852
852
|
dst[key] = src[key];
|
853
853
|
}
|
@@ -1053,7 +1053,7 @@ function startingTag(element) {
|
|
1053
1053
|
try {
|
1054
1054
|
// turns out IE does not let you set .html() on elements which
|
1055
1055
|
// are not allowed to have children. So we just ignore it.
|
1056
|
-
element.
|
1056
|
+
element.empty();
|
1057
1057
|
} catch(e) {}
|
1058
1058
|
// As Per DOM Standards
|
1059
1059
|
var TEXT_NODE = 3;
|
@@ -1409,23 +1409,25 @@ function getter(obj, path, bindFnToScope) {
|
|
1409
1409
|
}
|
1410
1410
|
|
1411
1411
|
/**
|
1412
|
-
* Return the siblings between
|
1413
|
-
* @param {
|
1412
|
+
* Return the DOM siblings between the first and last node in the given array.
|
1413
|
+
* @param {Array} array like object
|
1414
1414
|
* @returns jQlite object containing the elements
|
1415
1415
|
*/
|
1416
|
-
function getBlockElements(
|
1417
|
-
|
1418
|
-
|
1416
|
+
function getBlockElements(nodes) {
|
1417
|
+
var startNode = nodes[0],
|
1418
|
+
endNode = nodes[nodes.length - 1];
|
1419
|
+
if (startNode === endNode) {
|
1420
|
+
return jqLite(startNode);
|
1419
1421
|
}
|
1420
1422
|
|
1421
|
-
var element =
|
1423
|
+
var element = startNode;
|
1422
1424
|
var elements = [element];
|
1423
1425
|
|
1424
1426
|
do {
|
1425
1427
|
element = element.nextSibling;
|
1426
1428
|
if (!element) break;
|
1427
1429
|
elements.push(element);
|
1428
|
-
} while (element !==
|
1430
|
+
} while (element !== endNode);
|
1429
1431
|
|
1430
1432
|
return jqLite(elements);
|
1431
1433
|
}
|
@@ -1765,6 +1767,7 @@ function setupModuleLoader(window) {
|
|
1765
1767
|
ngHideDirective,
|
1766
1768
|
ngIfDirective,
|
1767
1769
|
ngIncludeDirective,
|
1770
|
+
ngIncludeFillContentDirective,
|
1768
1771
|
ngInitDirective,
|
1769
1772
|
ngNonBindableDirective,
|
1770
1773
|
ngPluralizeDirective,
|
@@ -1826,11 +1829,11 @@ function setupModuleLoader(window) {
|
|
1826
1829
|
* - `codeName` – `{string}` – Code name of the release, such as "jiggling-armfat".
|
1827
1830
|
*/
|
1828
1831
|
var version = {
|
1829
|
-
full: '1.2.
|
1832
|
+
full: '1.2.5', // all of these placeholder strings will be replaced by grunt's
|
1830
1833
|
major: 1, // package task
|
1831
1834
|
minor: 2,
|
1832
|
-
dot:
|
1833
|
-
codeName: '
|
1835
|
+
dot: 5,
|
1836
|
+
codeName: 'singularity-expansion'
|
1834
1837
|
};
|
1835
1838
|
|
1836
1839
|
|
@@ -1918,6 +1921,9 @@ function publishExternalAPI(angular){
|
|
1918
1921
|
ngRequired: requiredDirective,
|
1919
1922
|
ngValue: ngValueDirective
|
1920
1923
|
}).
|
1924
|
+
directive({
|
1925
|
+
ngInclude: ngIncludeFillContentDirective
|
1926
|
+
}).
|
1921
1927
|
directive(ngAttributeAliasDirectives).
|
1922
1928
|
directive(ngEventDirectives);
|
1923
1929
|
$provide.provider({
|
@@ -1995,6 +2001,7 @@ function publishExternalAPI(angular){
|
|
1995
2001
|
* - [`contents()`](http://api.jquery.com/contents/)
|
1996
2002
|
* - [`css()`](http://api.jquery.com/css/)
|
1997
2003
|
* - [`data()`](http://api.jquery.com/data/)
|
2004
|
+
* - [`empty()`](http://api.jquery.com/empty/)
|
1998
2005
|
* - [`eq()`](http://api.jquery.com/eq/)
|
1999
2006
|
* - [`find()`](http://api.jquery.com/find/) - Limited to lookups by tag name
|
2000
2007
|
* - [`hasClass()`](http://api.jquery.com/hasClass/)
|
@@ -2307,6 +2314,15 @@ function jqLiteInheritedData(element, name, value) {
|
|
2307
2314
|
}
|
2308
2315
|
}
|
2309
2316
|
|
2317
|
+
function jqLiteEmpty(element) {
|
2318
|
+
for (var i = 0, childNodes = element.childNodes; i < childNodes.length; i++) {
|
2319
|
+
jqLiteDealoc(childNodes[i]);
|
2320
|
+
}
|
2321
|
+
while (element.firstChild) {
|
2322
|
+
element.removeChild(element.firstChild);
|
2323
|
+
}
|
2324
|
+
}
|
2325
|
+
|
2310
2326
|
//////////////////////////////////////////
|
2311
2327
|
// Functions which are declared directly.
|
2312
2328
|
//////////////////////////////////////////
|
@@ -2501,7 +2517,9 @@ forEach({
|
|
2501
2517
|
jqLiteDealoc(childNodes[i]);
|
2502
2518
|
}
|
2503
2519
|
element.innerHTML = value;
|
2504
|
-
}
|
2520
|
+
},
|
2521
|
+
|
2522
|
+
empty: jqLiteEmpty
|
2505
2523
|
}, function(fn, name){
|
2506
2524
|
/**
|
2507
2525
|
* Properties: writes return selection, reads return first value
|
@@ -2511,11 +2529,13 @@ forEach({
|
|
2511
2529
|
|
2512
2530
|
// jqLiteHasClass has only two arguments, but is a getter-only fn, so we need to special-case it
|
2513
2531
|
// in a way that survives minification.
|
2514
|
-
|
2532
|
+
// jqLiteEmpty takes no arguments but is a setter.
|
2533
|
+
if (fn !== jqLiteEmpty &&
|
2534
|
+
(((fn.length == 2 && (fn !== jqLiteHasClass && fn !== jqLiteController)) ? arg1 : arg2) === undefined)) {
|
2515
2535
|
if (isObject(arg1)) {
|
2516
2536
|
|
2517
2537
|
// we are a write, but the object properties are the key/values
|
2518
|
-
for(i=0; i < this.length; i++) {
|
2538
|
+
for (i = 0; i < this.length; i++) {
|
2519
2539
|
if (fn === jqLiteData) {
|
2520
2540
|
// data() takes the whole object in jQuery
|
2521
2541
|
fn(this[i], arg1);
|
@@ -2540,7 +2560,7 @@ forEach({
|
|
2540
2560
|
}
|
2541
2561
|
} else {
|
2542
2562
|
// we are a write, so apply to all children
|
2543
|
-
for(i=0; i < this.length; i++) {
|
2563
|
+
for (i = 0; i < this.length; i++) {
|
2544
2564
|
fn(this[i], arg1, arg2);
|
2545
2565
|
}
|
2546
2566
|
// return self for chaining
|
@@ -2771,7 +2791,11 @@ forEach({
|
|
2771
2791
|
},
|
2772
2792
|
|
2773
2793
|
find: function(element, selector) {
|
2774
|
-
|
2794
|
+
if (element.getElementsByTagName) {
|
2795
|
+
return element.getElementsByTagName(selector);
|
2796
|
+
} else {
|
2797
|
+
return [];
|
2798
|
+
}
|
2775
2799
|
},
|
2776
2800
|
|
2777
2801
|
clone: jqLiteClone,
|
@@ -2907,6 +2931,28 @@ HashMap.prototype = {
|
|
2907
2931
|
* $rootScope.$digest();
|
2908
2932
|
* });
|
2909
2933
|
* </pre>
|
2934
|
+
*
|
2935
|
+
* Sometimes you want to get access to the injector of a currently running Angular app
|
2936
|
+
* from outside Angular. Perhaps, you want to inject and compile some markup after the
|
2937
|
+
* application has been bootstrapped. You can do this using extra `injector()` added
|
2938
|
+
* to JQuery/jqLite elements. See {@link angular.element}.
|
2939
|
+
*
|
2940
|
+
* *This is fairly rare but could be the case if a third party library is injecting the
|
2941
|
+
* markup.*
|
2942
|
+
*
|
2943
|
+
* In the following example a new block of HTML containing a `ng-controller`
|
2944
|
+
* directive is added to the end of the document body by JQuery. We then compile and link
|
2945
|
+
* it into the current AngularJS scope.
|
2946
|
+
*
|
2947
|
+
* <pre>
|
2948
|
+
* var $div = $('<div ng-controller="MyCtrl">{{content.label}}</div>');
|
2949
|
+
* $(document.body).append($div);
|
2950
|
+
*
|
2951
|
+
* angular.element(document).injector().invoke(function($compile) {
|
2952
|
+
* var scope = angular.element($div).scope();
|
2953
|
+
* $compile($div)(scope);
|
2954
|
+
* });
|
2955
|
+
* </pre>
|
2910
2956
|
*/
|
2911
2957
|
|
2912
2958
|
|
@@ -3101,7 +3147,7 @@ function annotate(fn) {
|
|
3101
3147
|
* // ...
|
3102
3148
|
* }
|
3103
3149
|
* // Define function dependencies
|
3104
|
-
* MyController
|
3150
|
+
* MyController['$inject'] = ['$scope', '$route'];
|
3105
3151
|
*
|
3106
3152
|
* // Then
|
3107
3153
|
* expect(injector.annotate(MyController)).toEqual(['$scope', '$route']);
|
@@ -3627,24 +3673,9 @@ function createInjector(modulesToLoad) {
|
|
3627
3673
|
fn = fn[length];
|
3628
3674
|
}
|
3629
3675
|
|
3630
|
-
|
3631
|
-
//
|
3632
|
-
|
3633
|
-
case 0: return fn();
|
3634
|
-
case 1: return fn(args[0]);
|
3635
|
-
case 2: return fn(args[0], args[1]);
|
3636
|
-
case 3: return fn(args[0], args[1], args[2]);
|
3637
|
-
case 4: return fn(args[0], args[1], args[2], args[3]);
|
3638
|
-
case 5: return fn(args[0], args[1], args[2], args[3], args[4]);
|
3639
|
-
case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]);
|
3640
|
-
case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
|
3641
|
-
case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);
|
3642
|
-
case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
|
3643
|
-
args[8]);
|
3644
|
-
case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7],
|
3645
|
-
args[8], args[9]);
|
3646
|
-
default: return fn.apply(self, args);
|
3647
|
-
}
|
3676
|
+
// http://jsperf.com/angularjs-invoke-apply-vs-switch
|
3677
|
+
// #5388
|
3678
|
+
return fn.apply(self, args);
|
3648
3679
|
}
|
3649
3680
|
|
3650
3681
|
function instantiate(Type, locals) {
|
@@ -4803,7 +4834,7 @@ function $TemplateCacheProvider() {
|
|
4803
4834
|
* * (no prefix) - Locate the required controller on the current element. Throw an error if not found.
|
4804
4835
|
* * `?` - Attempt to locate the required controller or pass `null` to the `link` fn if not found.
|
4805
4836
|
* * `^` - Locate the required controller by searching the element's parents. Throw an error if not found.
|
4806
|
-
* * `?^` - Attempt to locate the required controller by searching the element's
|
4837
|
+
* * `?^` - Attempt to locate the required controller by searching the element's parents or pass `null` to the
|
4807
4838
|
* `link` fn if not found.
|
4808
4839
|
*
|
4809
4840
|
*
|
@@ -5542,7 +5573,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
5542
5573
|
createBoundTranscludeFn(scope, childTranscludeFn || transcludeFn)
|
5543
5574
|
);
|
5544
5575
|
} else {
|
5545
|
-
nodeLinkFn(childLinkFn, childScope, node,
|
5576
|
+
nodeLinkFn(childLinkFn, childScope, node, $rootElement, boundTranscludeFn);
|
5546
5577
|
}
|
5547
5578
|
} else if (childLinkFn) {
|
5548
5579
|
childLinkFn(scope, node.childNodes, undefined, boundTranscludeFn);
|
@@ -5830,7 +5861,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
5830
5861
|
});
|
5831
5862
|
} else {
|
5832
5863
|
$template = jqLite(jqLiteClone(compileNode)).contents();
|
5833
|
-
$compileNode.
|
5864
|
+
$compileNode.empty(); // clear contents
|
5834
5865
|
childTranscludeFn = compile($template, transcludeFn);
|
5835
5866
|
}
|
5836
5867
|
}
|
@@ -6011,7 +6042,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6011
6042
|
optional = (match[2] == '?'),
|
6012
6043
|
mode = match[1], // @, =, or &
|
6013
6044
|
lastValue,
|
6014
|
-
parentGet, parentSet;
|
6045
|
+
parentGet, parentSet, compare;
|
6015
6046
|
|
6016
6047
|
isolateScope.$$isolateBindings[scopeName] = mode + attrName;
|
6017
6048
|
|
@@ -6034,6 +6065,11 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6034
6065
|
return;
|
6035
6066
|
}
|
6036
6067
|
parentGet = $parse(attrs[attrName]);
|
6068
|
+
if (parentGet.literal) {
|
6069
|
+
compare = equals;
|
6070
|
+
} else {
|
6071
|
+
compare = function(a,b) { return a === b; };
|
6072
|
+
}
|
6037
6073
|
parentSet = parentGet.assign || function() {
|
6038
6074
|
// reset the change, or we will throw this exception on every $digest
|
6039
6075
|
lastValue = isolateScope[scopeName] = parentGet(scope);
|
@@ -6044,19 +6080,18 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6044
6080
|
lastValue = isolateScope[scopeName] = parentGet(scope);
|
6045
6081
|
isolateScope.$watch(function parentValueWatch() {
|
6046
6082
|
var parentValue = parentGet(scope);
|
6047
|
-
|
6048
|
-
if (parentValue !== isolateScope[scopeName]) {
|
6083
|
+
if (!compare(parentValue, isolateScope[scopeName])) {
|
6049
6084
|
// we are out of sync and need to copy
|
6050
|
-
if (parentValue
|
6085
|
+
if (!compare(parentValue, lastValue)) {
|
6051
6086
|
// parent changed and it has precedence
|
6052
|
-
|
6087
|
+
isolateScope[scopeName] = parentValue;
|
6053
6088
|
} else {
|
6054
6089
|
// if the parent can be assigned then do so
|
6055
|
-
parentSet(scope, parentValue =
|
6090
|
+
parentSet(scope, parentValue = isolateScope[scopeName]);
|
6056
6091
|
}
|
6057
6092
|
}
|
6058
|
-
return parentValue;
|
6059
|
-
});
|
6093
|
+
return lastValue = parentValue;
|
6094
|
+
}, null, parentGet.literal);
|
6060
6095
|
break;
|
6061
6096
|
|
6062
6097
|
case '&':
|
@@ -6258,7 +6293,7 @@ function $CompileProvider($provide, $$sanitizeUriProvider) {
|
|
6258
6293
|
? origAsyncDirective.templateUrl($compileNode, tAttrs)
|
6259
6294
|
: origAsyncDirective.templateUrl;
|
6260
6295
|
|
6261
|
-
$compileNode.
|
6296
|
+
$compileNode.empty();
|
6262
6297
|
|
6263
6298
|
$http.get($sce.getTrustedResourceUrl(templateUrl), {cache: $templateCache}).
|
6264
6299
|
success(function(content) {
|
@@ -8048,8 +8083,8 @@ function $InterpolateProvider() {
|
|
8048
8083
|
*
|
8049
8084
|
<pre>
|
8050
8085
|
var $interpolate = ...; // injected
|
8051
|
-
var exp = $interpolate('Hello {{name}}!');
|
8052
|
-
expect(exp({name:'Angular'}).toEqual('Hello
|
8086
|
+
var exp = $interpolate('Hello {{name | uppercase}}!');
|
8087
|
+
expect(exp({name:'Angular'}).toEqual('Hello ANGULAR!');
|
8053
8088
|
</pre>
|
8054
8089
|
*
|
8055
8090
|
*
|
@@ -9247,23 +9282,24 @@ function ensureSafeMemberName(name, fullExpression) {
|
|
9247
9282
|
|
9248
9283
|
function ensureSafeObject(obj, fullExpression) {
|
9249
9284
|
// nifty check if obj is Function that is fast and works across iframes and other contexts
|
9250
|
-
if (obj
|
9251
|
-
|
9252
|
-
|
9253
|
-
|
9254
|
-
|
9255
|
-
|
9256
|
-
|
9257
|
-
|
9258
|
-
|
9259
|
-
|
9260
|
-
|
9261
|
-
|
9262
|
-
|
9263
|
-
|
9264
|
-
|
9265
|
-
|
9285
|
+
if (obj) {
|
9286
|
+
if (obj.constructor === obj) {
|
9287
|
+
throw $parseMinErr('isecfn',
|
9288
|
+
'Referencing Function in Angular expressions is disallowed! Expression: {0}',
|
9289
|
+
fullExpression);
|
9290
|
+
} else if (// isWindow(obj)
|
9291
|
+
obj.document && obj.location && obj.alert && obj.setInterval) {
|
9292
|
+
throw $parseMinErr('isecwindow',
|
9293
|
+
'Referencing the Window in Angular expressions is disallowed! Expression: {0}',
|
9294
|
+
fullExpression);
|
9295
|
+
} else if (// isElement(obj)
|
9296
|
+
obj.children && (obj.nodeName || (obj.on && obj.find))) {
|
9297
|
+
throw $parseMinErr('isecdom',
|
9298
|
+
'Referencing DOM nodes in Angular expressions is disallowed! Expression: {0}',
|
9299
|
+
fullExpression);
|
9300
|
+
}
|
9266
9301
|
}
|
9302
|
+
return obj;
|
9267
9303
|
}
|
9268
9304
|
|
9269
9305
|
var OPERATORS = {
|
@@ -10572,7 +10608,7 @@ function $ParseProvider() {
|
|
10572
10608
|
*
|
10573
10609
|
* # Differences between Kris Kowal's Q and $q
|
10574
10610
|
*
|
10575
|
-
* There are
|
10611
|
+
* There are two main differences:
|
10576
10612
|
*
|
10577
10613
|
* - $q is integrated with the {@link ng.$rootScope.Scope} Scope model observation
|
10578
10614
|
* mechanism in angular, which means faster propagation of resolution or rejection into your
|
@@ -11021,6 +11057,7 @@ function qFactory(nextTick, exceptionHandler) {
|
|
11021
11057
|
function $RootScopeProvider(){
|
11022
11058
|
var TTL = 10;
|
11023
11059
|
var $rootScopeMinErr = minErr('$rootScope');
|
11060
|
+
var lastDirtyWatch = null;
|
11024
11061
|
|
11025
11062
|
this.digestTtl = function(value) {
|
11026
11063
|
if (arguments.length) {
|
@@ -11105,11 +11142,11 @@ function $RootScopeProvider(){
|
|
11105
11142
|
* @description
|
11106
11143
|
* Creates a new child {@link ng.$rootScope.Scope scope}.
|
11107
11144
|
*
|
11108
|
-
* The parent scope will propagate the {@link ng.$rootScope.Scope
|
11109
|
-
* {@link ng.$rootScope.Scope
|
11110
|
-
* scope hierarchy using {@link ng.$rootScope.Scope
|
11145
|
+
* The parent scope will propagate the {@link ng.$rootScope.Scope#methods_$digest $digest()} and
|
11146
|
+
* {@link ng.$rootScope.Scope#methods_$digest $digest()} events. The scope can be removed from the
|
11147
|
+
* scope hierarchy using {@link ng.$rootScope.Scope#methods_$destroy $destroy()}.
|
11111
11148
|
*
|
11112
|
-
* {@link ng.$rootScope.Scope
|
11149
|
+
* {@link ng.$rootScope.Scope#methods_$destroy $destroy()} must be called on a scope when it is
|
11113
11150
|
* desired for the scope and its child scopes to be permanently detached from the parent and
|
11114
11151
|
* thus stop participating in model change detection and listener notification by invoking.
|
11115
11152
|
*
|
@@ -11122,7 +11159,7 @@ function $RootScopeProvider(){
|
|
11122
11159
|
*
|
11123
11160
|
*/
|
11124
11161
|
$new: function(isolate) {
|
11125
|
-
var
|
11162
|
+
var ChildScope,
|
11126
11163
|
child;
|
11127
11164
|
|
11128
11165
|
if (isolate) {
|
@@ -11132,11 +11169,11 @@ function $RootScopeProvider(){
|
|
11132
11169
|
child.$$asyncQueue = this.$$asyncQueue;
|
11133
11170
|
child.$$postDigestQueue = this.$$postDigestQueue;
|
11134
11171
|
} else {
|
11135
|
-
|
11172
|
+
ChildScope = function() {}; // should be anonymous; This is so that when the minifier munges
|
11136
11173
|
// the name it does not become random set of chars. This will then show up as class
|
11137
11174
|
// name in the debugger.
|
11138
|
-
|
11139
|
-
child = new
|
11175
|
+
ChildScope.prototype = this;
|
11176
|
+
child = new ChildScope();
|
11140
11177
|
child.$id = nextUid();
|
11141
11178
|
}
|
11142
11179
|
child['this'] = child;
|
@@ -11162,11 +11199,11 @@ function $RootScopeProvider(){
|
|
11162
11199
|
* @description
|
11163
11200
|
* Registers a `listener` callback to be executed whenever the `watchExpression` changes.
|
11164
11201
|
*
|
11165
|
-
* - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope
|
11202
|
+
* - The `watchExpression` is called on every call to {@link ng.$rootScope.Scope#methods_$digest
|
11166
11203
|
* $digest()} and should return the value that will be watched. (Since
|
11167
|
-
* {@link ng.$rootScope.Scope
|
11204
|
+
* {@link ng.$rootScope.Scope#methods_$digest $digest()} reruns when it detects changes the
|
11168
11205
|
* `watchExpression` can execute multiple times per
|
11169
|
-
* {@link ng.$rootScope.Scope
|
11206
|
+
* {@link ng.$rootScope.Scope#methods_$digest $digest()} and should be idempotent.)
|
11170
11207
|
* - The `listener` is called only when the value from the current `watchExpression` and the
|
11171
11208
|
* previous call to `watchExpression` are not equal (with the exception of the initial run,
|
11172
11209
|
* see below). The inequality is determined according to
|
@@ -11178,13 +11215,13 @@ function $RootScopeProvider(){
|
|
11178
11215
|
* iteration limit is 10 to prevent an infinite loop deadlock.
|
11179
11216
|
*
|
11180
11217
|
*
|
11181
|
-
* If you want to be notified whenever {@link ng.$rootScope.Scope
|
11218
|
+
* If you want to be notified whenever {@link ng.$rootScope.Scope#methods_$digest $digest} is called,
|
11182
11219
|
* you can register a `watchExpression` function with no `listener`. (Since `watchExpression`
|
11183
|
-
* can execute multiple times per {@link ng.$rootScope.Scope
|
11220
|
+
* can execute multiple times per {@link ng.$rootScope.Scope#methods_$digest $digest} cycle when a
|
11184
11221
|
* change is detected, be prepared for multiple calls to your listener.)
|
11185
11222
|
*
|
11186
11223
|
* After a watcher is registered with the scope, the `listener` fn is called asynchronously
|
11187
|
-
* (via {@link ng.$rootScope.Scope
|
11224
|
+
* (via {@link ng.$rootScope.Scope#methods_$evalAsync $evalAsync}) to initialize the
|
11188
11225
|
* watcher. In rare cases, this is undesirable because the listener is called when the result
|
11189
11226
|
* of `watchExpression` didn't change. To detect this scenario within the `listener` fn, you
|
11190
11227
|
* can compare the `newVal` and `oldVal`. If these two values are identical (`===`) then the
|
@@ -11216,7 +11253,7 @@ function $RootScopeProvider(){
|
|
11216
11253
|
|
11217
11254
|
|
11218
11255
|
|
11219
|
-
// Using a listener function
|
11256
|
+
// Using a listener function
|
11220
11257
|
var food;
|
11221
11258
|
scope.foodCounter = 0;
|
11222
11259
|
expect(scope.foodCounter).toEqual(0);
|
@@ -11241,14 +11278,14 @@ function $RootScopeProvider(){
|
|
11241
11278
|
// Update food and run digest. Now the counter will increment
|
11242
11279
|
food = 'cheeseburger';
|
11243
11280
|
scope.$digest();
|
11244
|
-
expect(scope.foodCounter).toEqual(1);
|
11281
|
+
expect(scope.foodCounter).toEqual(1);
|
11245
11282
|
|
11246
11283
|
* </pre>
|
11247
11284
|
*
|
11248
11285
|
*
|
11249
11286
|
*
|
11250
11287
|
* @param {(function()|string)} watchExpression Expression that is evaluated on each
|
11251
|
-
* {@link ng.$rootScope.Scope
|
11288
|
+
* {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. A change in the return value triggers
|
11252
11289
|
* a call to the `listener`.
|
11253
11290
|
*
|
11254
11291
|
* - `string`: Evaluated as {@link guide/expression expression}
|
@@ -11275,6 +11312,8 @@ function $RootScopeProvider(){
|
|
11275
11312
|
eq: !!objectEquality
|
11276
11313
|
};
|
11277
11314
|
|
11315
|
+
lastDirtyWatch = null;
|
11316
|
+
|
11278
11317
|
// in the case user pass string, we need to compile it, do we really need this ?
|
11279
11318
|
if (!isFunction(listener)) {
|
11280
11319
|
var listenFn = compileToFn(listener || noop, 'listener');
|
@@ -11344,7 +11383,7 @@ function $RootScopeProvider(){
|
|
11344
11383
|
*
|
11345
11384
|
* @param {string|Function(scope)} obj Evaluated as {@link guide/expression expression}. The
|
11346
11385
|
* expression value should evaluate to an object or an array which is observed on each
|
11347
|
-
* {@link ng.$rootScope.Scope
|
11386
|
+
* {@link ng.$rootScope.Scope#methods_$digest $digest} cycle. Any shallow change within the
|
11348
11387
|
* collection will trigger a call to the `listener`.
|
11349
11388
|
*
|
11350
11389
|
* @param {function(newCollection, oldCollection, scope)} listener a callback function that is
|
@@ -11449,9 +11488,9 @@ function $RootScopeProvider(){
|
|
11449
11488
|
* @function
|
11450
11489
|
*
|
11451
11490
|
* @description
|
11452
|
-
* Processes all of the {@link ng.$rootScope.Scope
|
11453
|
-
* its children. Because a {@link ng.$rootScope.Scope
|
11454
|
-
* the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope
|
11491
|
+
* Processes all of the {@link ng.$rootScope.Scope#methods_$watch watchers} of the current scope and
|
11492
|
+
* its children. Because a {@link ng.$rootScope.Scope#methods_$watch watcher}'s listener can change
|
11493
|
+
* the model, the `$digest()` keeps calling the {@link ng.$rootScope.Scope#methods_$watch watchers}
|
11455
11494
|
* until no more listeners are firing. This means that it is possible to get into an infinite
|
11456
11495
|
* loop. This function will throw `'Maximum iteration limit exceeded.'` if the number of
|
11457
11496
|
* iterations exceeds 10.
|
@@ -11459,12 +11498,12 @@ function $RootScopeProvider(){
|
|
11459
11498
|
* Usually, you don't call `$digest()` directly in
|
11460
11499
|
* {@link ng.directive:ngController controllers} or in
|
11461
11500
|
* {@link ng.$compileProvider#methods_directive directives}.
|
11462
|
-
* Instead, you should call {@link ng.$rootScope.Scope
|
11501
|
+
* Instead, you should call {@link ng.$rootScope.Scope#methods_$apply $apply()} (typically from within
|
11463
11502
|
* a {@link ng.$compileProvider#methods_directive directives}), which will force a `$digest()`.
|
11464
11503
|
*
|
11465
11504
|
* If you want to be notified whenever `$digest()` is called,
|
11466
11505
|
* you can register a `watchExpression` function with
|
11467
|
-
* {@link ng.$rootScope.Scope
|
11506
|
+
* {@link ng.$rootScope.Scope#methods_$watch $watch()} with no `listener`.
|
11468
11507
|
*
|
11469
11508
|
* In unit tests, you may need to call `$digest()` to simulate the scope life cycle.
|
11470
11509
|
*
|
@@ -11503,6 +11542,8 @@ function $RootScopeProvider(){
|
|
11503
11542
|
|
11504
11543
|
beginPhase('$digest');
|
11505
11544
|
|
11545
|
+
lastDirtyWatch = null;
|
11546
|
+
|
11506
11547
|
do { // "while dirty" loop
|
11507
11548
|
dirty = false;
|
11508
11549
|
current = target;
|
@@ -11512,10 +11553,13 @@ function $RootScopeProvider(){
|
|
11512
11553
|
asyncTask = asyncQueue.shift();
|
11513
11554
|
asyncTask.scope.$eval(asyncTask.expression);
|
11514
11555
|
} catch (e) {
|
11556
|
+
clearPhase();
|
11515
11557
|
$exceptionHandler(e);
|
11516
11558
|
}
|
11559
|
+
lastDirtyWatch = null;
|
11517
11560
|
}
|
11518
11561
|
|
11562
|
+
traverseScopesLoop:
|
11519
11563
|
do { // "traverse the scopes" loop
|
11520
11564
|
if ((watchers = current.$$watchers)) {
|
11521
11565
|
// process our watches
|
@@ -11525,25 +11569,34 @@ function $RootScopeProvider(){
|
|
11525
11569
|
watch = watchers[length];
|
11526
11570
|
// Most common watches are on primitives, in which case we can short
|
11527
11571
|
// circuit it with === operator, only when === fails do we use .equals
|
11528
|
-
if (watch
|
11529
|
-
|
11530
|
-
|
11531
|
-
|
11532
|
-
|
11533
|
-
|
11534
|
-
|
11535
|
-
|
11536
|
-
|
11537
|
-
|
11538
|
-
if (
|
11539
|
-
|
11540
|
-
|
11541
|
-
|
11542
|
-
|
11543
|
-
|
11572
|
+
if (watch) {
|
11573
|
+
if ((value = watch.get(current)) !== (last = watch.last) &&
|
11574
|
+
!(watch.eq
|
11575
|
+
? equals(value, last)
|
11576
|
+
: (typeof value == 'number' && typeof last == 'number'
|
11577
|
+
&& isNaN(value) && isNaN(last)))) {
|
11578
|
+
dirty = true;
|
11579
|
+
lastDirtyWatch = watch;
|
11580
|
+
watch.last = watch.eq ? copy(value) : value;
|
11581
|
+
watch.fn(value, ((last === initWatchVal) ? value : last), current);
|
11582
|
+
if (ttl < 5) {
|
11583
|
+
logIdx = 4 - ttl;
|
11584
|
+
if (!watchLog[logIdx]) watchLog[logIdx] = [];
|
11585
|
+
logMsg = (isFunction(watch.exp))
|
11586
|
+
? 'fn: ' + (watch.exp.name || watch.exp.toString())
|
11587
|
+
: watch.exp;
|
11588
|
+
logMsg += '; newVal: ' + toJson(value) + '; oldVal: ' + toJson(last);
|
11589
|
+
watchLog[logIdx].push(logMsg);
|
11590
|
+
}
|
11591
|
+
} else if (watch === lastDirtyWatch) {
|
11592
|
+
// If the most recently dirty watcher is now clean, short circuit since the remaining watchers
|
11593
|
+
// have already been tested.
|
11594
|
+
dirty = false;
|
11595
|
+
break traverseScopesLoop;
|
11544
11596
|
}
|
11545
11597
|
}
|
11546
11598
|
} catch (e) {
|
11599
|
+
clearPhase();
|
11547
11600
|
$exceptionHandler(e);
|
11548
11601
|
}
|
11549
11602
|
}
|
@@ -11552,13 +11605,16 @@ function $RootScopeProvider(){
|
|
11552
11605
|
// Insanity Warning: scope depth-first traversal
|
11553
11606
|
// yes, this code is a bit crazy, but it works and we have tests to prove it!
|
11554
11607
|
// this piece should be kept in sync with the traversal in $broadcast
|
11555
|
-
if (!(next = (current.$$childHead ||
|
11608
|
+
if (!(next = (current.$$childHead ||
|
11609
|
+
(current !== target && current.$$nextSibling)))) {
|
11556
11610
|
while(current !== target && !(next = current.$$nextSibling)) {
|
11557
11611
|
current = current.$parent;
|
11558
11612
|
}
|
11559
11613
|
}
|
11560
11614
|
} while ((current = next));
|
11561
11615
|
|
11616
|
+
// `break traverseScopesLoop;` takes us to here
|
11617
|
+
|
11562
11618
|
if(dirty && !(ttl--)) {
|
11563
11619
|
clearPhase();
|
11564
11620
|
throw $rootScopeMinErr('infdig',
|
@@ -11566,6 +11622,7 @@ function $RootScopeProvider(){
|
|
11566
11622
|
'Watchers fired in the last 5 iterations: {1}',
|
11567
11623
|
TTL, toJson(watchLog));
|
11568
11624
|
}
|
11625
|
+
|
11569
11626
|
} while (dirty || asyncQueue.length);
|
11570
11627
|
|
11571
11628
|
clearPhase();
|
@@ -11601,7 +11658,7 @@ function $RootScopeProvider(){
|
|
11601
11658
|
*
|
11602
11659
|
* @description
|
11603
11660
|
* Removes the current scope (and all of its children) from the parent scope. Removal implies
|
11604
|
-
* that calls to {@link ng.$rootScope.Scope
|
11661
|
+
* that calls to {@link ng.$rootScope.Scope#methods_$digest $digest()} will no longer
|
11605
11662
|
* propagate to the current scope and its children. Removal also implies that the current
|
11606
11663
|
* scope is eligible for garbage collection.
|
11607
11664
|
*
|
@@ -11618,11 +11675,12 @@ function $RootScopeProvider(){
|
|
11618
11675
|
*/
|
11619
11676
|
$destroy: function() {
|
11620
11677
|
// we can't destroy the root scope or a scope that has been already destroyed
|
11621
|
-
if (
|
11678
|
+
if (this.$$destroyed) return;
|
11622
11679
|
var parent = this.$parent;
|
11623
11680
|
|
11624
11681
|
this.$broadcast('$destroy');
|
11625
11682
|
this.$$destroyed = true;
|
11683
|
+
if (this === $rootScope) return;
|
11626
11684
|
|
11627
11685
|
if (parent.$$childHead == this) parent.$$childHead = this.$$nextSibling;
|
11628
11686
|
if (parent.$$childTail == this) parent.$$childTail = this.$$prevSibling;
|
@@ -11660,7 +11718,7 @@ function $RootScopeProvider(){
|
|
11660
11718
|
*
|
11661
11719
|
* - `string`: execute using the rules as defined in {@link guide/expression expression}.
|
11662
11720
|
* - `function(scope)`: execute the function with the current `scope` parameter.
|
11663
|
-
*
|
11721
|
+
*
|
11664
11722
|
* @param {(object)=} locals Local variables object, useful for overriding values in scope.
|
11665
11723
|
* @returns {*} The result of evaluating the expression.
|
11666
11724
|
*/
|
@@ -11682,7 +11740,7 @@ function $RootScopeProvider(){
|
|
11682
11740
|
*
|
11683
11741
|
* - it will execute after the function that scheduled the evaluation (preferably before DOM
|
11684
11742
|
* rendering).
|
11685
|
-
* - at least one {@link ng.$rootScope.Scope
|
11743
|
+
* - at least one {@link ng.$rootScope.Scope#methods_$digest $digest cycle} will be performed after
|
11686
11744
|
* `expression` execution.
|
11687
11745
|
*
|
11688
11746
|
* Any exceptions from the execution of the expression are forwarded to the
|
@@ -11727,7 +11785,7 @@ function $RootScopeProvider(){
|
|
11727
11785
|
* framework. (For example from browser DOM events, setTimeout, XHR or third party libraries).
|
11728
11786
|
* Because we are calling into the angular framework we need to perform proper scope life
|
11729
11787
|
* cycle of {@link ng.$exceptionHandler exception handling},
|
11730
|
-
* {@link ng.$rootScope.Scope
|
11788
|
+
* {@link ng.$rootScope.Scope#methods_$digest executing watches}.
|
11731
11789
|
*
|
11732
11790
|
* ## Life cycle
|
11733
11791
|
*
|
@@ -11748,11 +11806,11 @@ function $RootScopeProvider(){
|
|
11748
11806
|
* Scope's `$apply()` method transitions through the following stages:
|
11749
11807
|
*
|
11750
11808
|
* 1. The {@link guide/expression expression} is executed using the
|
11751
|
-
* {@link ng.$rootScope.Scope
|
11809
|
+
* {@link ng.$rootScope.Scope#methods_$eval $eval()} method.
|
11752
11810
|
* 2. Any exceptions from the execution of the expression are forwarded to the
|
11753
11811
|
* {@link ng.$exceptionHandler $exceptionHandler} service.
|
11754
|
-
* 3. The {@link ng.$rootScope.Scope
|
11755
|
-
* expression was executed using the {@link ng.$rootScope.Scope
|
11812
|
+
* 3. The {@link ng.$rootScope.Scope#methods_$watch watch} listeners are fired immediately after the
|
11813
|
+
* expression was executed using the {@link ng.$rootScope.Scope#methods_$digest $digest()} method.
|
11756
11814
|
*
|
11757
11815
|
*
|
11758
11816
|
* @param {(string|function())=} exp An angular expression to be executed.
|
@@ -11786,7 +11844,7 @@ function $RootScopeProvider(){
|
|
11786
11844
|
* @function
|
11787
11845
|
*
|
11788
11846
|
* @description
|
11789
|
-
* Listens on events of a given type. See {@link ng.$rootScope.Scope
|
11847
|
+
* Listens on events of a given type. See {@link ng.$rootScope.Scope#methods_$emit $emit} for
|
11790
11848
|
* discussion of event life cycle.
|
11791
11849
|
*
|
11792
11850
|
* The event listener function format is: `function(event, args...)`. The `event` object
|
@@ -11827,20 +11885,20 @@ function $RootScopeProvider(){
|
|
11827
11885
|
*
|
11828
11886
|
* @description
|
11829
11887
|
* Dispatches an event `name` upwards through the scope hierarchy notifying the
|
11830
|
-
* registered {@link ng.$rootScope.Scope
|
11888
|
+
* registered {@link ng.$rootScope.Scope#methods_$on} listeners.
|
11831
11889
|
*
|
11832
11890
|
* The event life cycle starts at the scope on which `$emit` was called. All
|
11833
|
-
* {@link ng.$rootScope.Scope
|
11891
|
+
* {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
|
11834
11892
|
* notified. Afterwards, the event traverses upwards toward the root scope and calls all
|
11835
11893
|
* registered listeners along the way. The event will stop propagating if one of the listeners
|
11836
11894
|
* cancels it.
|
11837
11895
|
*
|
11838
|
-
* Any exception emitted from the {@link ng.$rootScope.Scope
|
11896
|
+
* Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
|
11839
11897
|
* onto the {@link ng.$exceptionHandler $exceptionHandler} service.
|
11840
11898
|
*
|
11841
11899
|
* @param {string} name Event name to emit.
|
11842
11900
|
* @param {...*} args Optional set of arguments which will be passed onto the event listeners.
|
11843
|
-
* @return {Object} Event object (see {@link ng.$rootScope.Scope
|
11901
|
+
* @return {Object} Event object (see {@link ng.$rootScope.Scope#methods_$on}).
|
11844
11902
|
*/
|
11845
11903
|
$emit: function(name, args) {
|
11846
11904
|
var empty = [],
|
@@ -11896,19 +11954,19 @@ function $RootScopeProvider(){
|
|
11896
11954
|
*
|
11897
11955
|
* @description
|
11898
11956
|
* Dispatches an event `name` downwards to all child scopes (and their children) notifying the
|
11899
|
-
* registered {@link ng.$rootScope.Scope
|
11957
|
+
* registered {@link ng.$rootScope.Scope#methods_$on} listeners.
|
11900
11958
|
*
|
11901
11959
|
* The event life cycle starts at the scope on which `$broadcast` was called. All
|
11902
|
-
* {@link ng.$rootScope.Scope
|
11960
|
+
* {@link ng.$rootScope.Scope#methods_$on listeners} listening for `name` event on this scope get
|
11903
11961
|
* notified. Afterwards, the event propagates to all direct and indirect scopes of the current
|
11904
11962
|
* scope and calls all registered listeners along the way. The event cannot be canceled.
|
11905
11963
|
*
|
11906
|
-
* Any exception emitted from the {@link ng.$rootScope.Scope
|
11964
|
+
* Any exception emitted from the {@link ng.$rootScope.Scope#methods_$on listeners} will be passed
|
11907
11965
|
* onto the {@link ng.$exceptionHandler $exceptionHandler} service.
|
11908
11966
|
*
|
11909
11967
|
* @param {string} name Event name to broadcast.
|
11910
11968
|
* @param {...*} args Optional set of arguments which will be passed onto the event listeners.
|
11911
|
-
* @return {Object} Event object, see {@link ng.$rootScope.Scope
|
11969
|
+
* @return {Object} Event object, see {@link ng.$rootScope.Scope#methods_$on}
|
11912
11970
|
*/
|
11913
11971
|
$broadcast: function(name, args) {
|
11914
11972
|
var target = this,
|
@@ -13528,13 +13586,15 @@ function urlIsSameOrigin(requestUrl) {
|
|
13528
13586
|
<doc:source>
|
13529
13587
|
<script>
|
13530
13588
|
function Ctrl($scope, $window) {
|
13531
|
-
$scope.$window = $window;
|
13532
13589
|
$scope.greeting = 'Hello, World!';
|
13590
|
+
$scope.doGreeting = function(greeting) {
|
13591
|
+
$window.alert(greeting);
|
13592
|
+
};
|
13533
13593
|
}
|
13534
13594
|
</script>
|
13535
13595
|
<div ng-controller="Ctrl">
|
13536
13596
|
<input type="text" ng-model="greeting" />
|
13537
|
-
<button ng-click="
|
13597
|
+
<button ng-click="doGreeting(greeting)">ALERT</button>
|
13538
13598
|
</div>
|
13539
13599
|
</doc:source>
|
13540
13600
|
<doc:scenario>
|
@@ -14643,14 +14703,16 @@ var htmlAnchorDirective = valueFn({
|
|
14643
14703
|
element.append(document.createComment('IE fix'));
|
14644
14704
|
}
|
14645
14705
|
|
14646
|
-
|
14647
|
-
|
14648
|
-
|
14649
|
-
|
14650
|
-
|
14651
|
-
|
14652
|
-
|
14653
|
-
|
14706
|
+
if (!attr.href && !attr.name) {
|
14707
|
+
return function(scope, element) {
|
14708
|
+
element.on('click', function(event){
|
14709
|
+
// if we have no href url, then don't navigate anywhere.
|
14710
|
+
if (!element.attr('href')) {
|
14711
|
+
event.preventDefault();
|
14712
|
+
}
|
14713
|
+
});
|
14714
|
+
};
|
14715
|
+
}
|
14654
14716
|
}
|
14655
14717
|
});
|
14656
14718
|
|
@@ -15041,9 +15103,22 @@ var nullFormCtrl = {
|
|
15041
15103
|
* @property {Object} $error Is an object hash, containing references to all invalid controls or
|
15042
15104
|
* forms, where:
|
15043
15105
|
*
|
15044
|
-
* - keys are validation tokens (error names)
|
15045
|
-
* - values are arrays of controls or forms that are invalid
|
15106
|
+
* - keys are validation tokens (error names),
|
15107
|
+
* - values are arrays of controls or forms that are invalid for given error name.
|
15108
|
+
*
|
15109
|
+
*
|
15110
|
+
* Built-in validation tokens:
|
15046
15111
|
*
|
15112
|
+
* - `email`
|
15113
|
+
* - `max`
|
15114
|
+
* - `maxlength`
|
15115
|
+
* - `min`
|
15116
|
+
* - `minlength`
|
15117
|
+
* - `number`
|
15118
|
+
* - `pattern`
|
15119
|
+
* - `required`
|
15120
|
+
* - `url`
|
15121
|
+
*
|
15047
15122
|
* @description
|
15048
15123
|
* `FormController` keeps track of all its controls and nested forms as well as state of them,
|
15049
15124
|
* such as being valid/invalid or dirty/pristine.
|
@@ -16337,39 +16412,6 @@ var VALID_CLASS = 'ng-valid',
|
|
16337
16412
|
</file>
|
16338
16413
|
* </example>
|
16339
16414
|
*
|
16340
|
-
* ## Isolated Scope Pitfall
|
16341
|
-
*
|
16342
|
-
* Note that if you have a directive with an isolated scope, you cannot require `ngModel`
|
16343
|
-
* since the model value will be looked up on the isolated scope rather than the outer scope.
|
16344
|
-
* When the directive updates the model value, calling `ngModel.$setViewValue()` the property
|
16345
|
-
* on the outer scope will not be updated. However you can get around this by using $parent.
|
16346
|
-
*
|
16347
|
-
* Here is an example of this situation. You'll notice that the first div is not updating the input.
|
16348
|
-
* However the second div can update the input properly.
|
16349
|
-
*
|
16350
|
-
* <example module="badIsolatedDirective">
|
16351
|
-
<file name="script.js">
|
16352
|
-
angular.module('badIsolatedDirective', []).directive('isolate', function() {
|
16353
|
-
return {
|
16354
|
-
require: 'ngModel',
|
16355
|
-
scope: { },
|
16356
|
-
template: '<input ng-model="innerModel">',
|
16357
|
-
link: function(scope, element, attrs, ngModel) {
|
16358
|
-
scope.$watch('innerModel', function(value) {
|
16359
|
-
console.log(value);
|
16360
|
-
ngModel.$setViewValue(value);
|
16361
|
-
});
|
16362
|
-
}
|
16363
|
-
};
|
16364
|
-
});
|
16365
|
-
</file>
|
16366
|
-
<file name="index.html">
|
16367
|
-
<input ng-model="someModel"/>
|
16368
|
-
<div isolate ng-model="someModel"></div>
|
16369
|
-
<div isolate ng-model="$parent.someModel"></div>
|
16370
|
-
</file>
|
16371
|
-
* </example>
|
16372
|
-
*
|
16373
16415
|
*
|
16374
16416
|
*/
|
16375
16417
|
var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$parse',
|
@@ -16516,7 +16558,7 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
16516
16558
|
* It will update the $viewValue, then pass this value through each of the functions in `$parsers`,
|
16517
16559
|
* which includes any validators. The value that comes out of this `$parsers` pipeline, be applied to
|
16518
16560
|
* `$modelValue` and the **expression** specified in the `ng-model` attribute.
|
16519
|
-
*
|
16561
|
+
*
|
16520
16562
|
* Lastly, all the registered change listeners, in the `$viewChangeListeners` list, are called.
|
16521
16563
|
*
|
16522
16564
|
* Note that calling this function does not trigger a `$digest`.
|
@@ -16573,6 +16615,8 @@ var NgModelController = ['$scope', '$exceptionHandler', '$attrs', '$element', '$
|
|
16573
16615
|
ctrl.$render();
|
16574
16616
|
}
|
16575
16617
|
}
|
16618
|
+
|
16619
|
+
return value;
|
16576
16620
|
});
|
16577
16621
|
}];
|
16578
16622
|
|
@@ -16849,7 +16893,6 @@ var CONSTANT_VALUE_REGEXP = /^(true|false|\d+)$/;
|
|
16849
16893
|
id="{{name}}"
|
16850
16894
|
name="favorite">
|
16851
16895
|
</label>
|
16852
|
-
</span>
|
16853
16896
|
<div>You chose {{my.favorite}}</div>
|
16854
16897
|
</form>
|
16855
16898
|
</doc:source>
|
@@ -18066,9 +18109,12 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18066
18109
|
if (!childScope) {
|
18067
18110
|
childScope = $scope.$new();
|
18068
18111
|
$transclude(childScope, function (clone) {
|
18112
|
+
clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ');
|
18113
|
+
// Note: We only need the first/last node of the cloned nodes.
|
18114
|
+
// However, we need to keep the reference to the jqlite wrapper as it might be changed later
|
18115
|
+
// by a directive with templateUrl when it's template arrives.
|
18069
18116
|
block = {
|
18070
|
-
|
18071
|
-
endNode: clone[clone.length++] = document.createComment(' end ngIf: ' + $attr.ngIf + ' ')
|
18117
|
+
clone: clone
|
18072
18118
|
};
|
18073
18119
|
$animate.enter(clone, $element.parent(), $element);
|
18074
18120
|
});
|
@@ -18081,7 +18127,7 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18081
18127
|
}
|
18082
18128
|
|
18083
18129
|
if (block) {
|
18084
|
-
$animate.leave(getBlockElements(block));
|
18130
|
+
$animate.leave(getBlockElements(block.clone));
|
18085
18131
|
block = null;
|
18086
18132
|
}
|
18087
18133
|
}
|
@@ -18237,13 +18283,14 @@ var ngIfDirective = ['$animate', function($animate) {
|
|
18237
18283
|
* @description
|
18238
18284
|
* Emitted every time the ngInclude content is reloaded.
|
18239
18285
|
*/
|
18240
|
-
var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$
|
18241
|
-
function($http, $templateCache, $anchorScroll, $
|
18286
|
+
var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$animate', '$sce',
|
18287
|
+
function($http, $templateCache, $anchorScroll, $animate, $sce) {
|
18242
18288
|
return {
|
18243
18289
|
restrict: 'ECA',
|
18244
18290
|
priority: 400,
|
18245
18291
|
terminal: true,
|
18246
18292
|
transclude: 'element',
|
18293
|
+
controller: angular.noop,
|
18247
18294
|
compile: function(element, attr) {
|
18248
18295
|
var srcExp = attr.ngInclude || attr.src,
|
18249
18296
|
onloadExp = attr.onload || '',
|
@@ -18277,6 +18324,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18277
18324
|
$http.get(src, {cache: $templateCache}).success(function(response) {
|
18278
18325
|
if (thisChangeId !== changeCounter) return;
|
18279
18326
|
var newScope = scope.$new();
|
18327
|
+
ctrl.template = response;
|
18280
18328
|
|
18281
18329
|
// Note: This will also link all children of ng-include that were contained in the original
|
18282
18330
|
// html. If that content contains controllers, ... they could pollute/change the scope.
|
@@ -18284,15 +18332,14 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18284
18332
|
// Note: We can't remove them in the cloneAttchFn of $transclude as that
|
18285
18333
|
// function is called before linking the content, which would apply child
|
18286
18334
|
// directives to non existing elements.
|
18287
|
-
var clone = $transclude(newScope,
|
18288
|
-
|
18335
|
+
var clone = $transclude(newScope, function(clone) {
|
18336
|
+
cleanupLastIncludeContent();
|
18337
|
+
$animate.enter(clone, null, $element, afterAnimation);
|
18338
|
+
});
|
18289
18339
|
|
18290
18340
|
currentScope = newScope;
|
18291
18341
|
currentElement = clone;
|
18292
18342
|
|
18293
|
-
currentElement.html(response);
|
18294
|
-
$animate.enter(currentElement, null, $element, afterAnimation);
|
18295
|
-
$compile(currentElement.contents())(currentScope);
|
18296
18343
|
currentScope.$emit('$includeContentLoaded');
|
18297
18344
|
scope.$eval(onloadExp);
|
18298
18345
|
}).error(function() {
|
@@ -18301,6 +18348,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18301
18348
|
scope.$emit('$includeContentRequested');
|
18302
18349
|
} else {
|
18303
18350
|
cleanupLastIncludeContent();
|
18351
|
+
ctrl.template = null;
|
18304
18352
|
}
|
18305
18353
|
});
|
18306
18354
|
};
|
@@ -18308,6 +18356,24 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18308
18356
|
};
|
18309
18357
|
}];
|
18310
18358
|
|
18359
|
+
// This directive is called during the $transclude call of the first `ngInclude` directive.
|
18360
|
+
// It will replace and compile the content of the element with the loaded template.
|
18361
|
+
// We need this directive so that the element content is already filled when
|
18362
|
+
// the link function of another directive on the same element as ngInclude
|
18363
|
+
// is called.
|
18364
|
+
var ngIncludeFillContentDirective = ['$compile',
|
18365
|
+
function($compile) {
|
18366
|
+
return {
|
18367
|
+
restrict: 'ECA',
|
18368
|
+
priority: -400,
|
18369
|
+
require: 'ngInclude',
|
18370
|
+
link: function(scope, $element, $attr, ctrl) {
|
18371
|
+
$element.html(ctrl.template);
|
18372
|
+
$compile($element.contents())(scope);
|
18373
|
+
}
|
18374
|
+
};
|
18375
|
+
}];
|
18376
|
+
|
18311
18377
|
/**
|
18312
18378
|
* @ngdoc directive
|
18313
18379
|
* @name ng.directive:ngInit
|
@@ -18324,6 +18390,8 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18324
18390
|
* to initialize values on a scope.
|
18325
18391
|
* </div>
|
18326
18392
|
*
|
18393
|
+
* @priority 450
|
18394
|
+
*
|
18327
18395
|
* @element ANY
|
18328
18396
|
* @param {expression} ngInit {@link guide/expression Expression} to eval.
|
18329
18397
|
*
|
@@ -18355,6 +18423,7 @@ var ngIncludeDirective = ['$http', '$templateCache', '$anchorScroll', '$compile'
|
|
18355
18423
|
</doc:example>
|
18356
18424
|
*/
|
18357
18425
|
var ngInitDirective = ngDirective({
|
18426
|
+
priority: 450,
|
18358
18427
|
compile: function() {
|
18359
18428
|
return {
|
18360
18429
|
pre: function(scope, element, attrs) {
|
@@ -18912,7 +18981,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18912
18981
|
} else if (nextBlockMap.hasOwnProperty(trackById)) {
|
18913
18982
|
// restore lastBlockMap
|
18914
18983
|
forEach(nextBlockOrder, function(block) {
|
18915
|
-
if (block && block.
|
18984
|
+
if (block && block.scope) lastBlockMap[block.id] = block;
|
18916
18985
|
});
|
18917
18986
|
// This is a duplicate and we need to throw an error
|
18918
18987
|
throw ngRepeatMinErr('dupes', "Duplicates in a repeater are not allowed. Use 'track by' expression to specify unique keys. Repeater: {0}, Duplicate key: {1}",
|
@@ -18929,7 +18998,7 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18929
18998
|
// lastBlockMap is our own object so we don't need to use special hasOwnPropertyFn
|
18930
18999
|
if (lastBlockMap.hasOwnProperty(key)) {
|
18931
19000
|
block = lastBlockMap[key];
|
18932
|
-
elementsToRemove = getBlockElements(block);
|
19001
|
+
elementsToRemove = getBlockElements(block.clone);
|
18933
19002
|
$animate.leave(elementsToRemove);
|
18934
19003
|
forEach(elementsToRemove, function(element) { element[NG_REMOVED] = true; });
|
18935
19004
|
block.scope.$destroy();
|
@@ -18941,9 +19010,9 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18941
19010
|
key = (collection === collectionKeys) ? index : collectionKeys[index];
|
18942
19011
|
value = collection[key];
|
18943
19012
|
block = nextBlockOrder[index];
|
18944
|
-
if (nextBlockOrder[index - 1]) previousNode = nextBlockOrder[index - 1]
|
19013
|
+
if (nextBlockOrder[index - 1]) previousNode = getBlockEnd(nextBlockOrder[index - 1]);
|
18945
19014
|
|
18946
|
-
if (block.
|
19015
|
+
if (block.scope) {
|
18947
19016
|
// if we have already seen this object, then we need to reuse the
|
18948
19017
|
// associated scope/element
|
18949
19018
|
childScope = block.scope;
|
@@ -18953,11 +19022,11 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18953
19022
|
nextNode = nextNode.nextSibling;
|
18954
19023
|
} while(nextNode && nextNode[NG_REMOVED]);
|
18955
19024
|
|
18956
|
-
if (block
|
19025
|
+
if (getBlockStart(block) != nextNode) {
|
18957
19026
|
// existing item which got moved
|
18958
|
-
$animate.move(getBlockElements(block), null, jqLite(previousNode));
|
19027
|
+
$animate.move(getBlockElements(block.clone), null, jqLite(previousNode));
|
18959
19028
|
}
|
18960
|
-
previousNode = block
|
19029
|
+
previousNode = getBlockEnd(block);
|
18961
19030
|
} else {
|
18962
19031
|
// new item which we don't know about
|
18963
19032
|
childScope = $scope.$new();
|
@@ -18973,14 +19042,16 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18973
19042
|
childScope.$odd = !(childScope.$even = (index&1) === 0);
|
18974
19043
|
// jshint bitwise: true
|
18975
19044
|
|
18976
|
-
if (!block.
|
19045
|
+
if (!block.scope) {
|
18977
19046
|
$transclude(childScope, function(clone) {
|
18978
19047
|
clone[clone.length++] = document.createComment(' end ngRepeat: ' + expression + ' ');
|
18979
19048
|
$animate.enter(clone, null, jqLite(previousNode));
|
18980
19049
|
previousNode = clone;
|
18981
19050
|
block.scope = childScope;
|
18982
|
-
|
18983
|
-
|
19051
|
+
// Note: We only need the first/last node of the cloned nodes.
|
19052
|
+
// However, we need to keep the reference to the jqlite wrapper as it might be changed later
|
19053
|
+
// by a directive with templateUrl when it's template arrives.
|
19054
|
+
block.clone = clone;
|
18984
19055
|
nextBlockMap[block.id] = block;
|
18985
19056
|
});
|
18986
19057
|
}
|
@@ -18989,6 +19060,14 @@ var ngRepeatDirective = ['$parse', '$animate', function($parse, $animate) {
|
|
18989
19060
|
});
|
18990
19061
|
}
|
18991
19062
|
};
|
19063
|
+
|
19064
|
+
function getBlockStart(block) {
|
19065
|
+
return block.clone[0];
|
19066
|
+
}
|
19067
|
+
|
19068
|
+
function getBlockEnd(block) {
|
19069
|
+
return block.clone[block.clone.length - 1];
|
19070
|
+
}
|
18992
19071
|
}];
|
18993
19072
|
|
18994
19073
|
/**
|
@@ -19341,19 +19420,26 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
19341
19420
|
* @restrict EA
|
19342
19421
|
*
|
19343
19422
|
* @description
|
19344
|
-
* The ngSwitch directive is used to conditionally swap DOM structure on your template based on a scope expression.
|
19345
|
-
* Elements within ngSwitch but without ngSwitchWhen or ngSwitchDefault directives will be preserved at the location
|
19423
|
+
* The `ngSwitch` directive is used to conditionally swap DOM structure on your template based on a scope expression.
|
19424
|
+
* Elements within `ngSwitch` but without `ngSwitchWhen` or `ngSwitchDefault` directives will be preserved at the location
|
19346
19425
|
* as specified in the template.
|
19347
19426
|
*
|
19348
19427
|
* The directive itself works similar to ngInclude, however, instead of downloading template code (or loading it
|
19349
|
-
* from the template cache), ngSwitch simply choses one of the nested elements and makes it visible based on which element
|
19428
|
+
* from the template cache), `ngSwitch` simply choses one of the nested elements and makes it visible based on which element
|
19350
19429
|
* matches the value obtained from the evaluated expression. In other words, you define a container element
|
19351
|
-
* (where you place the directive), place an expression on the
|
19352
|
-
* (or the
|
19430
|
+
* (where you place the directive), place an expression on the **`on="..."` attribute**
|
19431
|
+
* (or the **`ng-switch="..."` attribute**), define any inner elements inside of the directive and place
|
19353
19432
|
* a when attribute per element. The when attribute is used to inform ngSwitch which element to display when the on
|
19354
19433
|
* expression is evaluated. If a matching expression is not found via a when attribute then an element with the default
|
19355
19434
|
* attribute is displayed.
|
19356
19435
|
*
|
19436
|
+
* <div class="alert alert-info">
|
19437
|
+
* Be aware that the attribute values to match against cannot be expressions. They are interpreted
|
19438
|
+
* as literal string values to match against.
|
19439
|
+
* For example, **`ng-switch-when="someVal"`** will match against the string `"someVal"` not against the
|
19440
|
+
* value of the expression `$scope.someVal`.
|
19441
|
+
* </div>
|
19442
|
+
|
19357
19443
|
* @animations
|
19358
19444
|
* enter - happens after the ngSwitch contents change and the matched child element is placed inside the container
|
19359
19445
|
* leave - happens just after the ngSwitch contents change and just before the former contents are removed from the DOM
|
@@ -19365,6 +19451,7 @@ var ngStyleDirective = ngDirective(function(scope, element, attr) {
|
|
19365
19451
|
* <ANY ng-switch-default>...</ANY>
|
19366
19452
|
* </ANY>
|
19367
19453
|
*
|
19454
|
+
*
|
19368
19455
|
* @scope
|
19369
19456
|
* @priority 800
|
19370
19457
|
* @param {*} ngSwitch|on expression to match against <tt>ng-switch-when</tt>.
|
@@ -19582,7 +19669,7 @@ var ngTranscludeDirective = ngDirective({
|
|
19582
19669
|
|
19583
19670
|
link: function($scope, $element, $attrs, controller) {
|
19584
19671
|
controller.$transclude(function(clone) {
|
19585
|
-
$element.
|
19672
|
+
$element.empty();
|
19586
19673
|
$element.append(clone);
|
19587
19674
|
});
|
19588
19675
|
}
|
@@ -19966,13 +20053,13 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
|
|
19966
20053
|
// becomes the compilation root
|
19967
20054
|
nullOption.removeClass('ng-scope');
|
19968
20055
|
|
19969
|
-
// we need to remove it before calling selectElement.
|
20056
|
+
// we need to remove it before calling selectElement.empty() because otherwise IE will
|
19970
20057
|
// remove the label from the element. wtf?
|
19971
20058
|
nullOption.remove();
|
19972
20059
|
}
|
19973
20060
|
|
19974
20061
|
// clear contents, we'll add what's needed based on the model
|
19975
|
-
selectElement.
|
20062
|
+
selectElement.empty();
|
19976
20063
|
|
19977
20064
|
selectElement.on('change', function() {
|
19978
20065
|
scope.$apply(function() {
|