将控制器传递给$ ionicModal

Jua*_*ano 40 ionic-framework

我想知道你是否可以将控制器传递给$ ionicModal服务.就像是.

$ionicModal.fromTemplateUrl('templates/login.html', {
  scope: $scope,
  controller: 'MyModalCotroller'
})
Run Code Online (Sandbox Code Playgroud)

一点上下文:我想有一个分布在应用程序中的模态,我不想在每个控制器中重复所有方法(隐藏,显示,模态内的按钮),我想从''中删除方法主控制器'保持清洁.这将封装模态的功能.

有没有办法做到这一点.?谢谢

Rip*_*ker 31

只需在模式的html主体中添加要使用的控制器即可.我创建了一个小提琴,向您展示一个基于离子文档中提供的示例:http://jsfiddle.net/g6pdkfL8/

但基本上:

<-- template for the modal window -->
<ion-modal-view>
<ion-content ng-controller="ModalController">
 ...
</ion-content>
<ion-modal-view>
Run Code Online (Sandbox Code Playgroud)

  • 或者,我只是想到这一点,你可以通常将$ scope传递给模态并使用$ scope.$ parent.modal.(我刚刚更新了小提琴以显示这个) (2认同)

Man*_*kla 25

在离子方面没有直接的方法.但是,如果您确实希望在一个地方隔离一些公共代码,则可以使用服务来执行此操作.这是怎么回事.

  1. 在模态声明中,将范围传递为null,模态声明也应该在服务中移动.
app.service('utilsService', function($ionicModal) {

    this.showModal = function() {

        var service = this;

        $ionicModal.fromTemplateUrl('templates/login.html', {
          scope: null,
          controller: 'MyModalCotroller'
        }).then(function(modal) {
            service.modal = modal;
            service.modal.show();
        });
    };

    this.hideModal = function() {
        this.modal.hide();
    };

});
Run Code Online (Sandbox Code Playgroud)
  1. 您的所有常用方法也将转移到同一服务中.

  1. 将对此服务的引用添加到控制器的范围中.
    app.controller('indexController', function($scope, utilsService) {
        $scope.utilsService = utilsService;
    });
Run Code Online (Sandbox Code Playgroud)
  1. 现在,您可以直接使用此服务从视图中调用所有常用方法.
e.g. <button ng-click="utilsService.hideModal()">Hide modal</button>
Run Code Online (Sandbox Code Playgroud)


jul*_*zzi 21

基于这个问题和其他需求,我创建了一个有用的服务.

无论如何使用CodePen代码,这个更新,改进,它使$ ionicModal的参数'选项'可用.

看到这篇文章:离子模态服务或参见操作: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
})();
Run Code Online (Sandbox Code Playgroud)

用法:

appModalService
 .show('<templateUrl>', '<controllerName> or <controllerName as ..>', <parameters obj>)
 .then(function(result) {
     // result from modal controller: $scope.closeModal(result) or <as name here>.closeModal(result) [Only on template]
 }, function(err) {
     // error
 });
Run Code Online (Sandbox Code Playgroud)

您可以使用其他服务来集中所有模态的配置:

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....
}

}]);
Run Code Online (Sandbox Code Playgroud)


jge*_*tle 5

创建一个在模态内部使用的指令,在指令内部可以为模态分配它自己的控制器和作用域.如果有人想要一些示例代码,我可以提出一些建议.