angular1弹窗封装

111 阅读1分钟

在以往的angular文件中,打开页面弹窗逻辑,在父页面一并开发,可视性差,综上查询资料,单独开发弹窗页面,实现模块化。

$scope.opendDialog = function() {
     $uibModal.open({
     animation: false,
     backdrop: 'static', // 用于指定是否显示背景遮罩层。可以是 `true`(默认)、`false` 或 `'static'`(点击遮罩层不会关闭模态窗口)
     keyboard: false, // 用于指定是否允许通过按Esc键关闭模态窗口。默认为 `true`。
     templateUrl: '../recruitment/modal/unusedDialog.html',  // 用于指定模态窗口的HTML模板
     size: 'sm', // 用于指定模态窗口的大小。
     resolve: {  // 属性值为一个函数,该函数返回一个promise
                parentScope: function(){ return $scope; }},
                controller: function($scope, parentScope){ // 用于指定模态窗口的控制器
                
                //弹窗变量定义了
                //弹窗查询接口逻辑...
                //弹窗提交接口逻辑...
                //弹窗关闭事件了....
                
             }
           });
        }

弹窗结构

baseInfo.ctrl.js、 baseInfo.html

1、现父页面只需开发实现以下代码配置,更简洁易懂

 $scope.comparison = function (item) {
    $scope.currentItem = item, //这块是把父组件的数据传过去,子组件通过注入parentScope父组件的数据,比如查询条件
        $uibModal.open({
            animation: false,
            backdrop: 'static',
            keyboard: false,
            windowClass: 'custom-modal-window',
            templateUrl: '../view-pop/basicInfo.html',
            resolve: {
              loadScript: loadScript(['../view-pop/basicInfo.ctrl.js']),
              // **关键点**:注入父组件作用域
              //这块是把父组件的数据传过去,子组件通过注入parentScope父组件的数据,比如查询条件
              parentScope: function () { return $scope; } 
              //只传递需要的数据
              itemData: function() { return angular.copy(item); },
              queryParams: function() { return $scope.queryParams; }
            },
            controller: 'basicInfo-Ctrl', //这块控制器是单独的一个js文件、
        })
}
        $scope.callback = function () {
            $uibModalInstance.dismiss();
        }

2、主要涉及到配置打开的页面路径、以及对应的控制器、弹窗关闭事件的回调

app.controllerProvider.register('basicInfo-Ctrl', ['$scope', '$rootScope', 'parentScope',
    function ($scope, $rootScope, parentScope,) {
        $scope.currentItem = parentScope.currentItem
        }
}

优点:

  1. 之前定义的弹窗,无法自定义弹窗大小,只能通过size参数调整, 现可通过在baseInfo页面自定义style样式;
  2. 现可在父页面调用统一公共接口,避免每次弹窗打开在调用,造成性能消耗;
  3. 弹窗可复用,通过父页面参数传递,减少冗余代码量。