diff --git a/src/ng/directive/input.js b/src/ng/directive/input.js
index 3c97c14bf832..1793e570f2a3 100644
--- a/src/ng/directive/input.js
+++ b/src/ng/directive/input.js
@@ -958,7 +958,7 @@ function baseInputType(scope, element, attr, ctrl, $sniffer, $browser) {
// a row.
var revalidate = validity && ctrl.$$hasNativeValidators;
if (ctrl.$viewValue !== value || (value === '' && revalidate)) {
- if (scope.$$phase) {
+ if (scope.$root.$$phase) {
ctrl.$setViewValue(value, event, revalidate);
} else {
scope.$apply(function() {
diff --git a/src/ng/directive/ngEventDirs.js b/src/ng/directive/ngEventDirs.js
index ebcb0920a4ad..58361dc7965c 100644
--- a/src/ng/directive/ngEventDirs.js
+++ b/src/ng/directive/ngEventDirs.js
@@ -51,7 +51,7 @@ forEach(
'click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste'.split(' '),
function(name) {
var directiveName = directiveNormalize('ng-' + name);
- ngEventDirectives[directiveName] = ['$parse', function($parse) {
+ ngEventDirectives[directiveName] = ['$parse', '$rootScope', function($parse, $rootScope) {
return {
restrict: 'A',
compile: function($element, attr) {
@@ -62,7 +62,7 @@ forEach(
var callback = function() {
fn(scope, {$event:event});
};
- if (forceAsyncEvents[eventName] && scope.$$phase) {
+ if (forceAsyncEvents[eventName] && $rootScope.$$phase) {
scope.$evalAsync(callback);
} else {
scope.$apply(callback);
diff --git a/test/ng/directive/inputSpec.js b/test/ng/directive/inputSpec.js
index 4d66b0415321..3c5e6d437cb1 100644
--- a/test/ng/directive/inputSpec.js
+++ b/test/ng/directive/inputSpec.js
@@ -1152,19 +1152,30 @@ describe('input', function() {
});
if (!_jqLiteMode) {
- it('should not cause the double $digest when triggering an event using jQuery', function() {
- $sniffer.hasEvent = function(eventName) {
- return eventName !== 'input';
- };
+ describe('double $digest when triggering an event using jQuery', function() {
+ function run() {
+ $sniffer.hasEvent = function(eventName) {
+ return eventName !== 'input';
+ };
+
+ compileInput('');
+
+ scope.field = 'fake field';
+ scope.$watch('field', function() {
+ // We need to use _originalTrigger since trigger is modified by Angular Scenario.
+ inputElm._originalTrigger('change');
+ });
+ scope.$apply();
+ }
- compileInput('');
+ it('should not cause the double $digest with non isolate scopes', function() {
+ run();
+ });
- scope.field = 'fake field';
- scope.$watch('field', function() {
- // We need to use _originalTrigger since trigger is modified by Angular Scenario.
- inputElm._originalTrigger('change');
+ it('should not cause the double $digest with isolate scopes', function() {
+ scope = scope.$new(true);
+ run();
});
- scope.$apply();
});
}
});
diff --git a/test/ng/directive/ngEventDirsSpec.js b/test/ng/directive/ngEventDirsSpec.js
index 1e1d5c92be55..71e89343d289 100644
--- a/test/ng/directive/ngEventDirsSpec.js
+++ b/test/ng/directive/ngEventDirsSpec.js
@@ -42,18 +42,30 @@ describe('event directives', function() {
describe('focus', function() {
- it('should call the listener asynchronously during $apply',
- inject(function($rootScope, $compile) {
- element = $compile('')($rootScope);
- $rootScope.focus = jasmine.createSpy('focus');
+ describe('call the listener asynchronously during $apply', function() {
+ function run(scope) {
+ inject(function($compile) {
+ element = $compile('')(scope);
+ scope.focus = jasmine.createSpy('focus');
- $rootScope.$apply(function() {
- element.triggerHandler('focus');
- expect($rootScope.focus).not.toHaveBeenCalled();
- });
+ scope.$apply(function() {
+ element.triggerHandler('focus');
+ expect(scope.focus).not.toHaveBeenCalled();
+ });
- expect($rootScope.focus).toHaveBeenCalledOnce();
- }));
+ expect(scope.focus).toHaveBeenCalledOnce();
+ });
+ }
+
+ it('should call the listener with non isolate scopes', inject(function($rootScope) {
+ run($rootScope.$new());
+ }));
+
+ it('should call the listener with isolate scopes', inject(function($rootScope) {
+ run($rootScope.$new(true));
+ }));
+
+ });
it('should call the listener synchronously inside of $apply if outside of $apply',
inject(function($rootScope, $compile) {
@@ -72,18 +84,30 @@ describe('event directives', function() {
describe('blur', function() {
- it('should call the listener asynchronously during $apply',
- inject(function($rootScope, $compile) {
- element = $compile('')($rootScope);
- $rootScope.blur = jasmine.createSpy('blur');
+ describe('call the listener asynchronously during $apply', function() {
+ function run(scope) {
+ inject(function($compile) {
+ element = $compile('')(scope);
+ scope.blur = jasmine.createSpy('blur');
- $rootScope.$apply(function() {
- element.triggerHandler('blur');
- expect($rootScope.blur).not.toHaveBeenCalled();
- });
+ scope.$apply(function() {
+ element.triggerHandler('blur');
+ expect(scope.blur).not.toHaveBeenCalled();
+ });
- expect($rootScope.blur).toHaveBeenCalledOnce();
- }));
+ expect(scope.blur).toHaveBeenCalledOnce();
+ });
+ }
+
+ it('should call the listener with non isolate scopes', inject(function($rootScope) {
+ run($rootScope.$new());
+ }));
+
+ it('should call the listener with isolate scopes', inject(function($rootScope) {
+ run($rootScope.$new(true));
+ }));
+
+ });
it('should call the listener synchronously inside of $apply if outside of $apply',
inject(function($rootScope, $compile) {