angularjs-rails 1.2.1 → 1.2.2

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ff35c5f1c0d084a8bae307cf16c9ebd6fc000d94
4
- data.tar.gz: 14b3dd9904a2ef1e7500273bef92f861fbbaaee8
3
+ metadata.gz: 0825fcb1c4da6f3d997bf9bd9c3a3fa143912870
4
+ data.tar.gz: a58f53f0cc10ab535cd11a55b869dcf7b51fc141
5
5
  SHA512:
6
- metadata.gz: 9d013f75a6420a655bde4f8c166c0bdceee3781fd71e579686c25a9ef84200618a9ff2bc9b5fd2a3984035b0e8b28806f3ea1c5dcea6d9e9b485b8c2c7cf70d0
7
- data.tar.gz: 23032f7c161ea8f1c978f0af642ee77b700e61f557d1411cbcff5e2610d4e109fc431508615ac5b8fe252235f571c13385942d32005992739359af45490419c1
6
+ metadata.gz: 9e3b52d663925653eb3790d0c4d3000ebc3a36864a630e78dae28bd7e887c8dae3d488f8c1700d5af2b442706c771caefe204764e43f89c1685c8bfb089aaad0
7
+ data.tar.gz: be95b1c2ce922824abec3fba7b66919e450b98d9c8e2ffcf917f9574c66e491fb4c8f9c3bec1cb05bf2cee3926679132f0bed34011818a9b300b8efc3653660e
@@ -1,6 +1,6 @@
1
1
  module AngularJS
2
2
  module Rails
3
- VERSION = "1.2.1"
3
+ VERSION = "1.2.2"
4
4
  UNSTABLE_VERSION = "1.1.5"
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.1
2
+ * @license AngularJS v1.2.2
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -165,7 +165,7 @@
165
165
  * }
166
166
  * </pre>
167
167
  *
168
- * Staggering animations work by default in ngRepeat (so long as the CSS class is defiend). Outside of ngRepeat, to use staggering animations
168
+ * Staggering animations work by default in ngRepeat (so long as the CSS class is defined). Outside of ngRepeat, to use staggering animations
169
169
  * on your own, they can be triggered by firing multiple calls to the same event on $animate. However, the restrictions surrounding this
170
170
  * are that each of the elements must have the same CSS className value as well as the same parent element. A stagger operation
171
171
  * will also be reset if more than 10ms has passed after the last animation has been fired.
@@ -228,7 +228,7 @@
228
228
  * JavaScript-defined animations are created with a CSS-like class selector and a collection of events which are set to run
229
229
  * a javascript callback function. When an animation is triggered, $animate will look for a matching animation which fits
230
230
  * the element's CSS class attribute value and then run the matching animation event function (if found).
231
- * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function
231
+ * In other words, if the CSS classes present on the animated element match any of the JavaScript animations then the callback function will
232
232
  * be executed. It should be also noted that only simple, single class selectors are allowed (compound class selectors are not supported).
233
233
  *
234
234
  * Within a JavaScript animation, an object containing various event callback animation functions is expected to be returned.
@@ -516,6 +516,7 @@ angular.module('ngAnimate', ['ng'])
516
516
  * @function
517
517
  *
518
518
  * @param {boolean=} value If provided then set the animation on or off.
519
+ * @param {jQuery/jqLite element=} element If provided then the element will be used to represent the enable/disable operation
519
520
  * @return {boolean} Current animation state.
520
521
  *
521
522
  * @description
@@ -554,7 +555,8 @@ angular.module('ngAnimate', ['ng'])
554
555
  and the onComplete callback will be fired once the animation is fully complete.
555
556
  */
556
557
  function performAnimation(animationEvent, className, element, parentElement, afterElement, domOperation, doneCallback) {
557
- var classes = (element.attr('class') || '') + ' ' + className;
558
+ var currentClassName = element.attr('class') || '';
559
+ var classes = currentClassName + ' ' + className;
558
560
  var animationLookup = (' ' + classes).replace(/\s+/g,'.');
559
561
  if (!parentElement) {
560
562
  parentElement = afterElement ? afterElement.parent() : element.parent();
@@ -569,7 +571,7 @@ angular.module('ngAnimate', ['ng'])
569
571
  //the animation if any matching animations are not found at all.
570
572
  //NOTE: IE8 + IE9 should close properly (run closeAnimation()) in case a NO animation is not found.
571
573
  if (animationsDisabled(element, parentElement) || matches.length === 0) {
572
- domOperation();
574
+ fireDOMOperation();
573
575
  closeAnimation();
574
576
  return;
575
577
  }
@@ -602,27 +604,48 @@ angular.module('ngAnimate', ['ng'])
602
604
  //this would mean that an animation was not allowed so let the existing
603
605
  //animation do it's thing and close this one early
604
606
  if(animations.length === 0) {
605
- domOperation();
607
+ fireDOMOperation();
606
608
  fireDoneCallbackAsync();
607
609
  return;
608
610
  }
609
611
 
612
+ //this value will be searched for class-based CSS className lookup. Therefore,
613
+ //we prefix and suffix the current className value with spaces to avoid substring
614
+ //lookups of className tokens
615
+ var futureClassName = ' ' + currentClassName + ' ';
610
616
  if(ngAnimateState.running) {
611
617
  //if an animation is currently running on the element then lets take the steps
612
618
  //to cancel that animation and fire any required callbacks
613
619
  $timeout.cancel(ngAnimateState.closeAnimationTimeout);
614
620
  cleanup(element);
615
621
  cancelAnimations(ngAnimateState.animations);
616
- (ngAnimateState.done || noop)(true);
622
+
623
+ //if the class is removed during the reflow then it will revert the styles temporarily
624
+ //back to the base class CSS styling causing a jump-like effect to occur. This check
625
+ //here ensures that the domOperation is only performed after the reflow has commenced
626
+ if(ngAnimateState.beforeComplete) {
627
+ (ngAnimateState.done || noop)(true);
628
+ } else if(isClassBased && !ngAnimateState.structural) {
629
+ //class-based animations will compare element className values after cancelling the
630
+ //previous animation to see if the element properties already contain the final CSS
631
+ //class and if so then the animation will be skipped. Since the domOperation will
632
+ //be performed only after the reflow is complete then our element's className value
633
+ //will be invalid. Therefore the same string manipulation that would occur within the
634
+ //DOM operation will be performed below so that the class comparison is valid...
635
+ futureClassName = ngAnimateState.event == 'removeClass' ?
636
+ futureClassName.replace(ngAnimateState.className, '') :
637
+ futureClassName + ngAnimateState.className + ' ';
638
+ }
617
639
  }
618
640
 
619
641
  //There is no point in perform a class-based animation if the element already contains
620
642
  //(on addClass) or doesn't contain (on removeClass) the className being animated.
621
643
  //The reason why this is being called after the previous animations are cancelled
622
644
  //is so that the CSS classes present on the element can be properly examined.
623
- if((animationEvent == 'addClass' && element.hasClass(className)) ||
624
- (animationEvent == 'removeClass' && !element.hasClass(className))) {
625
- domOperation();
645
+ var classNameToken = ' ' + className + ' ';
646
+ if((animationEvent == 'addClass' && futureClassName.indexOf(classNameToken) >= 0) ||
647
+ (animationEvent == 'removeClass' && futureClassName.indexOf(classNameToken) == -1)) {
648
+ fireDOMOperation();
626
649
  fireDoneCallbackAsync();
627
650
  return;
628
651
  }
@@ -633,6 +656,8 @@ angular.module('ngAnimate', ['ng'])
633
656
 
634
657
  element.data(NG_ANIMATE_STATE, {
635
658
  running:true,
659
+ event:animationEvent,
660
+ className:className,
636
661
  structural:!isClassBased,
637
662
  animations:animations,
638
663
  done:onBeforeAnimationsComplete
@@ -643,7 +668,7 @@ angular.module('ngAnimate', ['ng'])
643
668
  invokeRegisteredAnimationFns(animations, 'before', onBeforeAnimationsComplete);
644
669
 
645
670
  function onBeforeAnimationsComplete(cancelled) {
646
- domOperation();
671
+ fireDOMOperation();
647
672
  if(cancelled === true) {
648
673
  closeAnimation();
649
674
  return;
@@ -701,6 +726,15 @@ angular.module('ngAnimate', ['ng'])
701
726
  doneCallback && $timeout(doneCallback, 0, false);
702
727
  }
703
728
 
729
+ //it is less complicated to use a flag than managing and cancelling
730
+ //timeouts containing multiple callbacks.
731
+ function fireDOMOperation() {
732
+ if(!fireDOMOperation.hasBeenRun) {
733
+ fireDOMOperation.hasBeenRun = true;
734
+ domOperation();
735
+ }
736
+ }
737
+
704
738
  function closeAnimation() {
705
739
  if(!closeAnimation.hasBeenRun) {
706
740
  closeAnimation.hasBeenRun = true;
@@ -743,10 +777,10 @@ angular.module('ngAnimate', ['ng'])
743
777
  function cancelAnimations(animations) {
744
778
  var isCancelledFlag = true;
745
779
  forEach(animations, function(animation) {
746
- if(!animations['beforeComplete']) {
780
+ if(!animations.beforeComplete) {
747
781
  (animation.beforeEnd || noop)(isCancelledFlag);
748
782
  }
749
- if(!animations['afterComplete']) {
783
+ if(!animations.afterComplete) {
750
784
  (animation.afterEnd || noop)(isCancelledFlag);
751
785
  }
752
786
  });
@@ -848,13 +882,6 @@ angular.module('ngAnimate', ['ng'])
848
882
  }, 10, false);
849
883
  }
850
884
 
851
- function applyStyle(node, style) {
852
- var oldStyle = node.getAttribute('style') || '';
853
- var newStyle = (oldStyle.length > 0 ? '; ' : '') + style;
854
- node.setAttribute('style', newStyle);
855
- return oldStyle;
856
- }
857
-
858
885
  function getElementAnimationDetails(element, cacheKey) {
859
886
  var data = cacheKey ? lookupCache[cacheKey] : null;
860
887
  if(!data) {
@@ -973,7 +1000,9 @@ angular.module('ngAnimate', ['ng'])
973
1000
  if(timings.transitionDuration > 0) {
974
1001
  element.addClass(NG_ANIMATE_FALLBACK_CLASS_NAME);
975
1002
  activeClassName += NG_ANIMATE_FALLBACK_ACTIVE_CLASS_NAME + ' ';
976
- node.style[TRANSITION_PROP + PROPERTY_KEY] = 'none';
1003
+ blockTransitions(element);
1004
+ } else {
1005
+ blockKeyframeAnimations(element);
977
1006
  }
978
1007
 
979
1008
  forEach(className.split(' '), function(klass, i) {
@@ -993,6 +1022,25 @@ angular.module('ngAnimate', ['ng'])
993
1022
  return true;
994
1023
  }
995
1024
 
1025
+ function blockTransitions(element) {
1026
+ element[0].style[TRANSITION_PROP + PROPERTY_KEY] = 'none';
1027
+ }
1028
+
1029
+ function blockKeyframeAnimations(element) {
1030
+ element[0].style[ANIMATION_PROP] = 'none 0s';
1031
+ }
1032
+
1033
+ function unblockTransitions(element) {
1034
+ var node = element[0], prop = TRANSITION_PROP + PROPERTY_KEY;
1035
+ if(node.style[prop] && node.style[prop].length > 0) {
1036
+ node.style[prop] = '';
1037
+ }
1038
+ }
1039
+
1040
+ function unblockKeyframeAnimations(element) {
1041
+ element[0].style[ANIMATION_PROP] = '';
1042
+ }
1043
+
996
1044
  function animateRun(element, className, activeAnimationComplete) {
997
1045
  var data = element.data(NG_ANIMATE_CSS_DATA_KEY);
998
1046
  if(!element.hasClass(className) || !data) {
@@ -1008,20 +1056,21 @@ angular.module('ngAnimate', ['ng'])
1008
1056
  var maxDelayTime = Math.max(timings.transitionDelay, timings.animationDelay) * 1000;
1009
1057
  var startTime = Date.now();
1010
1058
  var css3AnimationEvents = ANIMATIONEND_EVENT + ' ' + TRANSITIONEND_EVENT;
1011
- var formerStyle;
1012
1059
  var ii = data.ii;
1013
1060
 
1014
- var applyFallbackStyle, style = '';
1061
+ var applyFallbackStyle, style = '', appliedStyles = [];
1015
1062
  if(timings.transitionDuration > 0) {
1016
- node.style[TRANSITION_PROP + PROPERTY_KEY] = '';
1017
-
1018
1063
  var propertyStyle = timings.transitionPropertyStyle;
1019
1064
  if(propertyStyle.indexOf('all') == -1) {
1020
1065
  applyFallbackStyle = true;
1021
- var fallbackProperty = $sniffer.msie ? '-ms-zoom' : 'clip';
1066
+ var fallbackProperty = $sniffer.msie ? '-ms-zoom' : 'border-spacing';
1022
1067
  style += CSS_PREFIX + 'transition-property: ' + propertyStyle + ', ' + fallbackProperty + '; ';
1023
1068
  style += CSS_PREFIX + 'transition-duration: ' + timings.transitionDurationStyle + ', ' + timings.transitionDuration + 's; ';
1069
+ appliedStyles.push(CSS_PREFIX + 'transition-property');
1070
+ appliedStyles.push(CSS_PREFIX + 'transition-duration');
1024
1071
  }
1072
+ } else {
1073
+ unblockKeyframeAnimations(element);
1025
1074
  }
1026
1075
 
1027
1076
  if(ii > 0) {
@@ -1033,16 +1082,19 @@ angular.module('ngAnimate', ['ng'])
1033
1082
 
1034
1083
  style += CSS_PREFIX + 'transition-delay: ' +
1035
1084
  prepareStaggerDelay(delayStyle, stagger.transitionDelay, ii) + '; ';
1085
+ appliedStyles.push(CSS_PREFIX + 'transition-delay');
1036
1086
  }
1037
1087
 
1038
1088
  if(stagger.animationDelay > 0 && stagger.animationDuration === 0) {
1039
1089
  style += CSS_PREFIX + 'animation-delay: ' +
1040
1090
  prepareStaggerDelay(timings.animationDelayStyle, stagger.animationDelay, ii) + '; ';
1091
+ appliedStyles.push(CSS_PREFIX + 'animation-delay');
1041
1092
  }
1042
1093
  }
1043
1094
 
1044
- if(style.length > 0) {
1045
- formerStyle = applyStyle(node, style);
1095
+ if(appliedStyles.length > 0) {
1096
+ var oldStyle = node.getAttribute('style') || '';
1097
+ node.setAttribute('style', oldStyle + ' ' + style);
1046
1098
  }
1047
1099
 
1048
1100
  element.on(css3AnimationEvents, onAnimationProgress);
@@ -1055,10 +1107,8 @@ angular.module('ngAnimate', ['ng'])
1055
1107
  element.off(css3AnimationEvents, onAnimationProgress);
1056
1108
  element.removeClass(activeClassName);
1057
1109
  animateClose(element, className);
1058
- if(formerStyle != null) {
1059
- formerStyle.length > 0 ?
1060
- node.setAttribute('style', formerStyle) :
1061
- node.removeAttribute('style');
1110
+ for (var i in appliedStyles) {
1111
+ node.style.removeProperty(appliedStyles[i]);
1062
1112
  }
1063
1113
  };
1064
1114
 
@@ -1122,6 +1172,7 @@ angular.module('ngAnimate', ['ng'])
1122
1172
  //happen in the first place
1123
1173
  var cancel = preReflowCancellation;
1124
1174
  afterReflow(function() {
1175
+ unblockTransitions(element);
1125
1176
  //once the reflow is complete then we point cancel to
1126
1177
  //the new cancellation function which will remove all of the
1127
1178
  //animation properties from the active animation
@@ -1185,7 +1236,10 @@ angular.module('ngAnimate', ['ng'])
1185
1236
  beforeAddClass : function(element, className, animationCompleted) {
1186
1237
  var cancellationMethod = animateBefore(element, suffixClasses(className, '-add'));
1187
1238
  if(cancellationMethod) {
1188
- afterReflow(animationCompleted);
1239
+ afterReflow(function() {
1240
+ unblockTransitions(element);
1241
+ animationCompleted();
1242
+ });
1189
1243
  return cancellationMethod;
1190
1244
  }
1191
1245
  animationCompleted();
@@ -1198,7 +1252,10 @@ angular.module('ngAnimate', ['ng'])
1198
1252
  beforeRemoveClass : function(element, className, animationCompleted) {
1199
1253
  var cancellationMethod = animateBefore(element, suffixClasses(className, '-remove'));
1200
1254
  if(cancellationMethod) {
1201
- afterReflow(animationCompleted);
1255
+ afterReflow(function() {
1256
+ unblockTransitions(element);
1257
+ animationCompleted();
1258
+ });
1202
1259
  return cancellationMethod;
1203
1260
  }
1204
1261
  animationCompleted();
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.1
2
+ * @license AngularJS v1.2.2
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.1
2
+ * @license AngularJS v1.2.2
3
3
  * (c) 2010-2012 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.1/' +
72
+ message = message + '\nhttp://errors.angularjs.org/1.2.2/' +
73
73
  (module ? module + '/' : '') + code;
74
74
  for (i = 2; i < arguments.length; i++) {
75
75
  message = message + (i == 2 ? '?' : '&') + 'p' + (i-2) + '=' +
@@ -97,7 +97,12 @@ function setupModuleLoader(window) {
97
97
  return obj[name] || (obj[name] = factory());
98
98
  }
99
99
 
100
- return ensure(ensure(window, 'angular', Object), 'module', function() {
100
+ var angular = ensure(window, 'angular', Object);
101
+
102
+ // We need to expose `angular.$$minErr` to modules such as `ngResource` that reference it during bootstrap
103
+ angular.$$minErr = angular.$$minErr || minErr;
104
+
105
+ return ensure(angular, 'module', function() {
101
106
  /** @type {Object.<string, angular.Module>} */
102
107
  var modules = {};
103
108
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  /**
4
- * @license AngularJS v1.2.1
4
+ * @license AngularJS v1.2.2
5
5
  * (c) 2010-2012 Google, Inc. http://angularjs.org
6
6
  * License: MIT
7
7
  *
@@ -1572,7 +1572,7 @@ function MockHttpExpectation(method, url, data, headers) {
1572
1572
  if (angular.isUndefined(data)) return true;
1573
1573
  if (data && angular.isFunction(data.test)) return data.test(d);
1574
1574
  if (data && angular.isFunction(data)) return data(d);
1575
- if (data && !angular.isString(data)) return angular.toJson(data) == d;
1575
+ if (data && !angular.isString(data)) return angular.equals(data, angular.fromJson(d));
1576
1576
  return data == d;
1577
1577
  };
1578
1578
 
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.1
2
+ * @license AngularJS v1.2.2
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -444,7 +444,7 @@ angular.module('ngResource', ['ng']).
444
444
  }
445
445
  /* jshint +W086 */ /* (purposefully fall through case statements) */
446
446
 
447
- var isInstanceCall = data instanceof Resource;
447
+ var isInstanceCall = this instanceof Resource;
448
448
  var value = isInstanceCall ? data : (action.isArray ? [] : new Resource(data));
449
449
  var httpConfig = {};
450
450
  var responseInterceptor = action.interceptor && action.interceptor.response ||
@@ -527,7 +527,7 @@ angular.module('ngResource', ['ng']).
527
527
  if (isFunction(params)) {
528
528
  error = success; success = params; params = {};
529
529
  }
530
- var result = Resource[name](params, this, success, error);
530
+ var result = Resource[name].call(this, params, this, success, error);
531
531
  return result.$promise || result;
532
532
  };
533
533
  });
@@ -1,5 +1,5 @@
1
1
  /**
2
- * @license AngularJS v1.2.1
2
+ * @license AngularJS v1.2.2
3
3
  * (c) 2010-2012 Google, Inc. http://angularjs.org
4
4
  * License: MIT
5
5
  */
@@ -14,6 +14,9 @@
14
14
  *
15
15
  * The `ngRoute` module provides routing and deeplinking services and directives for angular apps.
16
16
  *
17
+ * ## Example
18
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
19
+ *
17
20
  * {@installModule route}
18
21
  *
19
22
  * <div doc-module-components="ngRoute"></div>
@@ -29,8 +32,12 @@ var ngRouteModule = angular.module('ngRoute', ['ng']).
29
32
  *
30
33
  * @description
31
34
  *
32
- * Used for configuring routes. See {@link ngRoute.$route $route} for an example.
35
+ * Used for configuring routes.
36
+ *
37
+ * ## Example
38
+ * See {@link ngRoute.$route#example $route} for an example of configuring and using `ngRoute`.
33
39
  *
40
+ * ## Dependencies
34
41
  * Requires the {@link ngRoute `ngRoute`} module to be installed.
35
42
  */
36
43
  function $RouteProvider(){
@@ -835,37 +842,43 @@ function ngViewFactory( $route, $anchorScroll, $compile, $controller,
835
842
 
836
843
  if (template) {
837
844
  var newScope = scope.$new();
838
- $transclude(newScope, function(clone) {
839
- clone.html(template);
840
- $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
841
- if (angular.isDefined(autoScrollExp)
842
- && (!autoScrollExp || scope.$eval(autoScrollExp))) {
843
- $anchorScroll();
844
- }
845
- });
846
845
 
847
- cleanupLastView();
846
+ // Note: This will also link all children of ng-view that were contained in the original
847
+ // html. If that content contains controllers, ... they could pollute/change the scope.
848
+ // However, using ng-view on an element with additional content does not make sense...
849
+ // Note: We can't remove them in the cloneAttchFn of $transclude as that
850
+ // function is called before linking the content, which would apply child
851
+ // directives to non existing elements.
852
+ var clone = $transclude(newScope, angular.noop);
853
+ clone.html(template);
854
+ $animate.enter(clone, null, currentElement || $element, function onNgViewEnter () {
855
+ if (angular.isDefined(autoScrollExp)
856
+ && (!autoScrollExp || scope.$eval(autoScrollExp))) {
857
+ $anchorScroll();
858
+ }
859
+ });
848
860
 
849
- var link = $compile(clone.contents()),
850
- current = $route.current;
861
+ cleanupLastView();
851
862
 
852
- currentScope = current.scope = newScope;
853
- currentElement = clone;
863
+ var link = $compile(clone.contents()),
864
+ current = $route.current;
854
865
 
855
- if (current.controller) {
856
- locals.$scope = currentScope;
857
- var controller = $controller(current.controller, locals);
858
- if (current.controllerAs) {
859
- currentScope[current.controllerAs] = controller;
860
- }
861
- clone.data('$ngControllerController', controller);
862
- clone.children().data('$ngControllerController', controller);
866
+ currentScope = current.scope = newScope;
867
+ currentElement = clone;
868
+
869
+ if (current.controller) {
870
+ locals.$scope = currentScope;
871
+ var controller = $controller(current.controller, locals);
872
+ if (current.controllerAs) {
873
+ currentScope[current.controllerAs] = controller;
863
874
  }
875
+ clone.data('$ngControllerController', controller);
876
+ clone.children().data('$ngControllerController', controller);
877
+ }
864
878
 
865
- link(currentScope);
866
- currentScope.$emit('$viewContentLoaded');
867
- currentScope.$eval(onloadExp);
868
- });
879
+ link(currentScope);
880
+ currentScope.$emit('$viewContentLoaded');
881
+ currentScope.$eval(onloadExp);
869
882
  } else {
870
883
  cleanupLastView();
871
884
  }