Pass a controller to $ionicModal

后端 未结 6 1302
醉酒成梦
醉酒成梦 2020-12-24 01:34

I am wondering if you can pass a controller to the $ionicModal service. Something like.

$ionicModal.fromTemplateUrl(\'templates/login.html\', {
  scope: $sco         


        
6条回答
  •  囚心锁ツ
    2020-12-24 01:49

    Based on this question and other needs I create a service that can be useful.

    Anyway use the CodePen code, this updated, improved and it makes available the parameter 'options' of $ionicModal.

    See this post: Ionic modal service or see in operation: CodePen

    (function () {
    'use strict';
    
    var serviceId = 'appModalService';
    angular.module('app').factory(serviceId, [
        '$ionicModal', '$rootScope', '$q', '$injector', '$controller', appModalService
    ]);
    
    function appModalService($ionicModal, $rootScope, $q, $injector, $controller) {
    
        return {
            show: show
        }
    
        function show(templateUrl, controller, parameters) {
            // Grab the injector and create a new scope
            var deferred = $q.defer(),
                ctrlInstance,
                modalScope = $rootScope.$new(),
                thisScopeId = modalScope.$id;
    
            $ionicModal.fromTemplateUrl(templateUrl, {
                scope: modalScope,
                animation: 'slide-in-up'
            }).then(function (modal) {
                modalScope.modal = modal;
    
                modalScope.openModal = function () {
                    modalScope.modal.show();
                };
                modalScope.closeModal = function (result) {
                    deferred.resolve(result);
                    modalScope.modal.hide();
            };
            modalScope.$on('modal.hidden', function (thisModal) {
                if (thisModal.currentScope) {
                    var modalScopeId = thisModal.currentScope.$id;
                    if (thisScopeId === modalScopeId) {
                        deferred.resolve(null);
                        _cleanup(thisModal.currentScope);
                    }
                }
            });
    
            // Invoke the controller
            var locals = { '$scope': modalScope, 'parameters': parameters };
            var ctrlEval = _evalController(controller);
            ctrlInstance = $controller(controller, locals);
            if (ctrlEval.isControllerAs) {
                ctrlInstance.openModal = modalScope.openModal;
                ctrlInstance.closeModal = modalScope.closeModal;
            }
    
            modalScope.modal.show();
    
            }, function (err) {
                deferred.reject(err);
            });
    
            return deferred.promise;
        }
    
        function _cleanup(scope) {
            scope.$destroy();
            if (scope.modal) {
                scope.modal.remove();
            }
        }
    
        function _evalController(ctrlName) {
            var result = {
                isControllerAs: false,
                controllerName: '',
                propName: ''
            };
            var fragments = (ctrlName || '').trim().split(/\s+/);
            result.isControllerAs = fragments.length === 3 && (fragments[1] || '').toLowerCase() === 'as';
            if (result.isControllerAs) {
                result.controllerName = fragments[0];
                result.propName = fragments[2];
            } else {
                result.controllerName = ctrlName;
            }
    
            return result;
        }
    
      } // end
    })();
    

    Usage:

    appModalService
     .show('', ' or ', )
     .then(function(result) {
         // result from modal controller: $scope.closeModal(result) or .closeModal(result) [Only on template]
     }, function(err) {
         // error
     });
    

    You can use another service to centralize the configuration of all modals:

    angular.module('app')
    .factory('myModals', ['appModalService', function (appModalService){
    
    var service = {
        showLogin: showLogin,
        showEditUser: showEditUser
    };
    
    function showLogin(userInfo){
        // return promise resolved by '$scope.closeModal(data)'
        // Use:
        // myModals.showLogin(userParameters) // get this inject 'parameters' on 'loginModalCtrl'
        //  .then(function (result) {
        //      // result from closeModal parameter
        //  });
        return appModalService.show('templates/modals/login.html', 'loginModalCtrl as vm', userInfo)
        // or not 'as controller'
        // return appModalService.show('templates/modals/login.html', 'loginModalCtrl', userInfo)
    }
    
    function showEditUser(address){
        // return appModalService....
    }
    
    }]);
    

提交回复
热议问题