Of course you can !, here you go:
app.factory('modalService', function ($document, $compile, $rootScope, $templateCache, $http) { var body = $document.find('body'), modals = []; var service = { show: function (template, data, modal) { // The template url var url = 'template/modal/' + template + '.html'; // A new scope for the modal using the passed data var scope = $rootScope.$new(); angular.extend(scope, data); // Wrapping the template with some extra markup modal = modal || angular.element('<div class="modal"/>'); // The modal api var api = { close: function () { modal.remove(); scope.$destroy(); modals.splice(modals.indexOf(api), 1); }, replace: function (template, data) { return angular.extend(api, service.show(template, data, modal)); } }; // Adding the modal to the body body.append(modal); // A close method scope.close = api.close; // Caching the template for future calls $http.get(url, {cache: $templateCache}) .then(function (response) { // Wrapping the template with some extra markup modal.html('<div class="win">' + response.data + '</div>'); // The important part $compile(modal)(scope); }); modals.push(modal); return api; }, showOrReplaceLast: function (template, data) { return service.show(template, data, modals.length > 0 ? modals[modals.length - 1] : null); } }; return service; });
Some notes:
- You need to insert modal somewhere in the DOM, so $ document is entered.
- Yes, you can take modal markup from here.
- Remember to create new areas for the dialog and destroy them ($ rootScope. $ New).
- This is WIP, I hope it is clear enough.
source share