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) {