AngularJS uibModal 可重用函数
AngularJS uibModal reusable function
我想不出正常的标题。对不起。
所以问题是在一个大项目中,有大量的业务逻辑有很多模态。每个新模式都是相同的代码,几乎没有变化,比如 templateUrl、控制器等等。这就是现在调用弹出窗口的方式:
return uibModal.open({
templateUrl: current.path + 'url.html',
controller: 'AppController',
windowClass: 'PopUp',
size: 'md',
resolve: {
disabled: [function () {
return scope.disabled;
}]
}
}).result.then(function( comment ){
record.comment = comment;
})
而且这个例程永远不会结束。所以我感兴趣的是 - 在您的项目中减少相同代码(与这种情况相同)的最佳实践是什么?你应该使用服务吗?或者只是创建全局函数?
在 AngularJS 中,您应该始终避免使用全局函数。为此目的创建了服务。我也用 $uibModal
并且厌倦了一遍又一遍地写同样的东西。
我做了一个ModalService
,它让我能够抽象掉很多重复的代码:
function ModalService() {
var ModalService = this;
ModalService.basicModal = function(options) {
var _options = options || {};
return $uibModal.open({
animation: angular.isDefined(_options.animation) ? _options.animation : true,
keyboard: angular.isDefined(_options.keyboard) ? _options.keyboard : true,
backdrop: _options.backdrop || 'static',
size: _options.size || 'sm',
templateUrl: _options.templateUrl || 'templates/modal-message.html', //default template in case user does not provide one
controller: _options.controller || ModalMessageCtrl, // a default controller in case user does not provide one
controllerAs: _options.controllerAs || 'vm',
resolve: options.resolve || {}
});
};
ModalService.simpleModal = function(options) {
...
};
}
您可以定义多种可以从控制器轻松调用的模式:
ModalService.basicModal();
ModalService.simpleModal();
// etc...
所有这些都可以接受可选参数来自定义模态:
ModalService.basicModal({
size: 'lg'
});
ModalService.simpleModal({
templateUrl: "my-custom-template.html",
controller: function($scope) {
//some custom inline controller
}
}).result.then(function() { //do something });
// etc...
您可以在应用程序的配置阶段使用$uibModalProvider.options
设置默认选项。
app.config(function($uibModalProvider) {
$uibModalProvider.options = {
windowClass: 'PopUp',
size: 'md'
};
});
如果您使用的是 UI Bootstrap 2.1.0 或更高版本,您还可以利用 angular 的基于组件的体系结构来删除打开模式时的一些多余内容.
给定一个组件定义如下:
app.component('myModal', {
bindings: {close: '&', dismiss: '&', resolve: '<'},
controller: MyModalController,
templateUrl: 'myModal.html'
});
您可以按如下方式利用模态中的组件:
$uibModal.open({
component: 'myModal',
resolve: {
// pass data to component
}
}).result.then(function() {
// Modal closed
}).catch(function() {
// Modal dismissed
});
我想不出正常的标题。对不起。
所以问题是在一个大项目中,有大量的业务逻辑有很多模态。每个新模式都是相同的代码,几乎没有变化,比如 templateUrl、控制器等等。这就是现在调用弹出窗口的方式:
return uibModal.open({
templateUrl: current.path + 'url.html',
controller: 'AppController',
windowClass: 'PopUp',
size: 'md',
resolve: {
disabled: [function () {
return scope.disabled;
}]
}
}).result.then(function( comment ){
record.comment = comment;
})
而且这个例程永远不会结束。所以我感兴趣的是 - 在您的项目中减少相同代码(与这种情况相同)的最佳实践是什么?你应该使用服务吗?或者只是创建全局函数?
在 AngularJS 中,您应该始终避免使用全局函数。为此目的创建了服务。我也用 $uibModal
并且厌倦了一遍又一遍地写同样的东西。
我做了一个ModalService
,它让我能够抽象掉很多重复的代码:
function ModalService() {
var ModalService = this;
ModalService.basicModal = function(options) {
var _options = options || {};
return $uibModal.open({
animation: angular.isDefined(_options.animation) ? _options.animation : true,
keyboard: angular.isDefined(_options.keyboard) ? _options.keyboard : true,
backdrop: _options.backdrop || 'static',
size: _options.size || 'sm',
templateUrl: _options.templateUrl || 'templates/modal-message.html', //default template in case user does not provide one
controller: _options.controller || ModalMessageCtrl, // a default controller in case user does not provide one
controllerAs: _options.controllerAs || 'vm',
resolve: options.resolve || {}
});
};
ModalService.simpleModal = function(options) {
...
};
}
您可以定义多种可以从控制器轻松调用的模式:
ModalService.basicModal();
ModalService.simpleModal();
// etc...
所有这些都可以接受可选参数来自定义模态:
ModalService.basicModal({
size: 'lg'
});
ModalService.simpleModal({
templateUrl: "my-custom-template.html",
controller: function($scope) {
//some custom inline controller
}
}).result.then(function() { //do something });
// etc...
您可以在应用程序的配置阶段使用$uibModalProvider.options
设置默认选项。
app.config(function($uibModalProvider) {
$uibModalProvider.options = {
windowClass: 'PopUp',
size: 'md'
};
});
如果您使用的是 UI Bootstrap 2.1.0 或更高版本,您还可以利用 angular 的基于组件的体系结构来删除打开模式时的一些多余内容.
给定一个组件定义如下:
app.component('myModal', {
bindings: {close: '&', dismiss: '&', resolve: '<'},
controller: MyModalController,
templateUrl: 'myModal.html'
});
您可以按如下方式利用模态中的组件:
$uibModal.open({
component: 'myModal',
resolve: {
// pass data to component
}
}).result.then(function() {
// Modal closed
}).catch(function() {
// Modal dismissed
});