From 342051e0af2ca5cd42555b30a47249006d6228b7 Mon Sep 17 00:00:00 2001 From: Andrew Date: Sat, 15 Nov 2014 12:01:34 -0700 Subject: [PATCH] feat(interimElement): allow options.parent to be a selector Closes #640. --- .../services/interimElement/interimElement.js | 9 ++-- .../interimElement/interimElement.spec.js | 44 +++++++++++++++++++ 2 files changed, 50 insertions(+), 3 deletions(-) diff --git a/src/core/services/interimElement/interimElement.js b/src/core/services/interimElement/interimElement.js index bec9f5e19f3..c258b178446 100644 --- a/src/core/services/interimElement/interimElement.js +++ b/src/core/services/interimElement/interimElement.js @@ -52,7 +52,7 @@ function InterimElementProvider() { */ provider.addPreset('build', { methods: ['controller', 'controllerAs', 'onRemove', 'onShow', 'resolve', - 'template', 'templateUrl', 'themable', 'transformTemplate'] + 'template', 'templateUrl', 'themable', 'transformTemplate', 'parent'] }); return provider; @@ -178,7 +178,7 @@ function InterimElementProvider() { } /* @ngInject */ - function InterimElementFactory($q, $rootScope, $timeout, $rootElement, $animate, $mdCompiler, $mdTheming) { + function InterimElementFactory($document, $q, $rootScope, $timeout, $rootElement, $animate, $mdCompiler, $mdTheming) { return function createInterimElementService() { /* @@ -280,10 +280,13 @@ function InterimElementProvider() { angular.extend(compileData.locals, self.options); // Search for parent at insertion time, if not specified - if (!options.parent) { + if (angular.isString(options.parent)) { + options.parent = angular.element($document[0].querySelector(options.parent)); + } else if (!options.parent) { options.parent = $rootElement.find('body'); if (!options.parent.length) options.parent = $rootElement; } + element = compileData.link(options.scope); if (options.themable) $mdTheming(element); var ret = options.onShow(options.scope, element, options); diff --git a/src/core/services/interimElement/interimElement.spec.js b/src/core/services/interimElement/interimElement.spec.js index 11745a6aede..af6bd70d4ab 100644 --- a/src/core/services/interimElement/interimElement.spec.js +++ b/src/core/services/interimElement/interimElement.spec.js @@ -249,6 +249,50 @@ describe('$$interimElement service', function() { it('returns a promise', inject(function($$interimElement) { expect(typeof Service.show().then).toBe('function'); })); + + it('defaults parent to $rootElement', inject(function($rootElement, $rootScope) { + var shown = false; + Service.show({ + onShow: function(scope, element, options) { + expect(options.parent[0]).toBe($rootElement[0]); + shown = true; + } + }); + $rootScope.$digest(); + expect(shown).toBe(true); + })); + + it('allows parent reference', inject(function($rootScope) { + var parent = angular.element('
'); + + var shown = false; + Service.show({ + parent: parent, + onShow: function(scope, element, options) { + expect(options.parent[0]).toBe(parent[0]); + shown = true; + } + }); + $rootScope.$digest(); + expect(shown).toBe(true); + })); + + it('allows string parent selector', inject(function($rootScope, $document) { + var parent = angular.element('
'); + spyOn($document[0], 'querySelector').andReturn(parent[0]); + + var shown = false; + Service.show({ + parent: '#super-parent', + onShow: function(scope, element, options) { + expect($document[0].querySelector).toHaveBeenCalledWith('#super-parent'); + expect(options.parent[0]).toBe(parent[0]); + shown = true; + } + }); + $rootScope.$digest(); + expect(shown).toBe(true); + })); });