我想知道你是否可以将控制器传递给$ 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)
Man*_*kla 25
在离子方面没有直接的方法.但是,如果您确实希望在一个地方隔离一些公共代码,则可以使用服务来执行此操作.这是怎么回事.
- 在模态声明中,将范围传递为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)
- 您的所有常用方法也将转移到同一服务中.
- 将对此服务的引用添加到控制器的范围中.
app.controller('indexController', function($scope, utilsService) {
$scope.utilsService = utilsService;
});
Run Code Online (Sandbox Code Playgroud)
- 现在,您可以直接使用此服务从视图中调用所有常用方法.
e.g. <button ng-click="utilsService.hideModal()">Hide modal</button>
Run Code Online (Sandbox Code Playgroud)
jul*_*zzi 21
基于这个问题和其他需求,我创建了一个有用的服务.
无论如何使用CodePen代码,这个更新,改进,它使$ ionicModal的参数'选项'可用.
(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)
| 归档时间: |
|
| 查看次数: |
27482 次 |
| 最近记录: |