【问题标题】:AngularJS uibModal reusable functionAngularJS uibModal 可重用函数
【发布时间】:2018-05-01 13:43:05
【问题描述】:

我想不出正常的标题。对此感到抱歉。
所以问题是在一个大项目中,有大业务逻辑有很多模式。而且每一个新的 modal 都是相同的代码,几乎没有什么变化,比如 templateUrl、controller 之类的东西。这就是现在调用弹出窗口的方式:

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;
                })

而且这个例程永远不会结束。所以我感兴趣的是 - 在您的项目中减少相同代码(与这种情况相同)的最佳实践是什么?你应该使用服务吗?或者只是创建全局函数?

【问题讨论】:

  • 如何将这段代码包装在一个函数中,并在每次调用时提供正确的控制器和模板作为参数?

标签: javascript angularjs angular-ui-bootstrap


【解决方案1】:

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

【讨论】:

  • 谢谢!这就是我一直在寻找的答案。顺便说一句,现在所有模态模板都在页面所在的同一目录中。这是正确的方法吗?比我必须将完整路径作为参数传递给服务
【解决方案2】:

您可以在应用程序的配置阶段使用$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
});

【讨论】:

  • 谢谢!这是非常有用的信息,我一定会使用它
猜你喜欢
  • 2017-04-13
  • 1970-01-01
  • 1970-01-01
  • 2016-03-30
  • 2021-03-26
  • 1970-01-01
  • 2018-12-05
  • 2018-10-16
  • 1970-01-01
相关资源
最近更新 更多