如何扩展/覆盖 Angular Material $mdDialog.show 中的默认选项?

     2023-02-22     181

关键词:

【中文标题】如何扩展/覆盖 Angular Material $mdDialog.show 中的默认选项?【英文标题】:How to extend/overwrite default options in Angular Material $mdDialog.show? 【发布时间】:2016-09-17 17:31:36 【问题描述】:

TL;DR:我需要一种方法来使用提供程序(与任何其他 Angular 模块一样 - a random example)覆盖提供我的 Angular 材质(尤其是在材质对话框中)提供的默认选项。

我一直在寻找一种方法来自定义默认值options Angular Material Modal,但没有任何可用的结果。

就像我在其他插件/模块上使用的一样,这种方式可以使用provider 来实现。查看材料的核心 (1.0.8) 我试图使用这样的setDefaults 方法设置选项(假设我只想暂时禁用背景):

app.config(['$mdDialogProvider', function($mdDialogProvider)
    console.log($mdDialogProvider); 
    // ^ $get/addMethod/addPreset/setDefaults

    var defaults = 
        options: function()
            return 
                hasBackdrop: false
            
        
    
    $mdDialogProvider.setDefaults(defaults);
]);

现在,当我检查 onComplete 回调上的选项时:

如您所见,hasBackdrop 选项已更新,但模式不再起作用,所以我想我遗漏了一些东西。

您知道如何以适当的方式扩展默认角度吗?

谢谢

UPDATE : 没有.setDefaults 活动的选项对象(de 初始状态)

注意:我从他们的核心 transformTemplate 复制并添加到我的默认对象中,但结果是相同的。我可以看到 DOM 更新了,控制台没有错误,但模式不可见。

【问题讨论】:

你能解释一下你最终想要达到的目标吗?制定任务,也许可以有一种更透明的方式来实现它然后修补原始服务 请检查我的更新。我只需要一种更新默认材质选项的方法。现在,假设我想删除所有模块的背景,我必须在每个 show 显示实例上调用它,而不是添加 hasBackdrop: false 作为所有模式的全局选项 我现在明白了。在我看来,您可以通过创建一个模态工厂来实现这一点,该工厂将使用更新的属性包装角材料模态。我会尽力说明我的意思 我为此做了一种包装服务,但我很好奇是否可以使用似乎是 Angular 的“正确方法”的提供程序。我还将使用我的服务更新代码。无论如何,将其添加到答案中,它可以以比我更好的方式完成。 【参考方案1】:

当您想从第三方库更新现有功能时,您应该尝试使用装饰器模式并装饰服务方法。

Angular 在配置应用程序时提供了一种在providers 上使用decorators 的简洁方法:https://docs.angularjs.org/api/auto/service/$provide

$provide.decorator

$provide.decorator(name, decorator);

使用 $injector 注册一个服务装饰器。服务装饰器拦截服务的创建,允许它覆盖或修改服务的行为。装饰器返回的对象可能是原始服务,也可能是替换或包装并委托给原始服务的新服务对象。

您可以为$mdDialogProvider 编写一个装饰器来扩展.show 方法的功能,并将扩展的options 对象传递给它,如下所示:

.config(function ($provide) 
  // Decorate the $mdDialog service using $provide.decorator
  $provide.decorator("$mdDialog", function ($delegate) 
    // Get a handle of the show method
    var methodHandle = $delegate.show;

    function decorateDialogShow () 
      var args = angular.extend(, arguments[0],  hasBackdrop: false )
      return methodHandle(args);
    

    $delegate.show = decorateDialogShow; 
    return $delegate;
  );
);

我创建了一个带有 hasBackdrop: false 工作示例的代码笔,因此在调用$mdDialog.show() 时不会显示背景:http://codepen.io/addi90/pen/RaXqRx

【讨论】:

对此的一个小提示:var args = angular.extend(, arguments[0], hasBackdrop: false )。我会更改顺序以确保模式特定选项将覆盖我的自定义默认值,因此将变为:var args = angular.extend(, hasBackdrop: false , arguments[0])。同样对于更简洁的代码,可以在变量中定义具有默认值的对象:D 同意。但这是对解决方案的优化:) 不错的解决方案!如果对话框是从Preset 创建的,也许您需要检查arguments[0]._options【参考方案2】:

请在此处找到带有演示的 codepen:http://codepen.io/shershen08/pen/vGoQZd?editors=1010

服务的外观如下:

   var dialogFactory = function($mdDialog) 
      var options = ;
  return 

    create: function(conf) 
      var preset = $mdDialog.alert()._options; //get defaults
      var newOptions = angular.extend(preset, conf, options);//extend with yours
      $mdDialog.show(newOptions);
    ,
    //toggle various props
    setProp: function(prop, val) 
      options[prop] = val;
    
  ;

;

在控制器中你可以像这样使用它:

$scope.toggleBackdrop = function() 
        $scope.backdrop = !$scope.backdrop;
        //here we change the state of the service internal var
        dialogService.setProp('hasBackdrop', $scope.backdrop);
      ;
      $scope.showDialogViaService = function(ev) 
        //here we fill in the needed params of the modal and pass to the service
        var obj = 
          'title': 'title',
          'content': 'content',
          'ok':'Ok!'
        ;
        dialogService.create(obj);
      

【讨论】:

有没有办法在 Angular 5 中轻松包装或扩展 Angular-material 指令?

】有没有办法在Angular5中轻松包装或扩展Angular-material指令?【英文标题】:IsthereawaytoeasilywraporextendAngular-materialdirectivesinAngular5?【发布时间】:2018-07-1105:16:17【问题描述】:我在angular5应用程序中到处使用angular-material库,但我不... 查看详情

Angular Material Snackbar 位置

】AngularMaterialSnackbar位置【英文标题】:AngularMaterialSnackbarposition【发布时间】:2020-10-2616:20:39【问题描述】:我想在我的标题下放置材料小吃栏(它的高度是60px)。问题是verticalPosition将snackbar放在顶部并覆盖标题。我试图添加... 查看详情

包装或扩展 angular-material 组件,允许将未知属性传递给子组件

】包装或扩展angular-material组件,允许将未知属性传递给子组件【英文标题】:Wraporextendangular-materialcomponentallowingpass-throughofunknownattributestochildcomponent【发布时间】:2018-10-2406:24:09【问题描述】:我们正在使用Angular5和材料设计,... 查看详情

Angular 2 Material - 如何居中进度微调器

】Angular2Material-如何居中进度微调器【英文标题】:Angular2Material-HowToCenterProgressSpinner【发布时间】:2017-05-1406:34:32【问题描述】:我已经从下面的链接实现了Angular2进度微调器https://github.com/angular/material2/tree/master/src/lib/progress-spin... 查看详情

如何有效地使用 Angular Material 自定义调色板颜色 Angular Material

】如何有效地使用AngularMaterial自定义调色板颜色AngularMaterial【英文标题】:HowtouseAngularMaterialcustom-palettecolorseffectivelyAngularMaterial【发布时间】:2019-04-0423:20:01【问题描述】:我正在使用自定义材质调色板。使用其默认阴影、深色... 查看详情

Angular Material mat-spinner 自定义颜色

】AngularMaterialmat-spinner自定义颜色【英文标题】:AngularMaterialmat-spinnercustomcolor【发布时间】:2018-07-2422:59:06【问题描述】:有谁知道如何在AngularMaterial中更改mat-spinner颜色?覆盖css不起作用。我尝试在材质文件中更改颜色,但它... 查看详情

如何覆盖(覆盖)material-ui(React)中的类和样式

】如何覆盖(覆盖)material-ui(React)中的类和样式【英文标题】:Howtooverride(overwrite)classesandstylesinmaterial-ui(React)【发布时间】:2018-11-2216:40:03【问题描述】:我正在使用material-ui的1.2.1版,我正在尝试覆盖AppBar组件以使其透明。... 查看详情

如何使用 Angular-Material 获得全高侧导航

】如何使用Angular-Material获得全高侧导航【英文标题】:HowtogetafullheightsidenavwithAngular-Material【发布时间】:2014-12-2816:01:09【问题描述】:我正在使用Angular-Material并实现了SideNav菜单。当屏幕尺寸较小时,菜单被隐藏,当单击菜单... 查看详情

Angular Material:如何将 floatPlaceholder 设置为从不

】AngularMaterial:如何将floatPlaceholder设置为从不【英文标题】:AngularMaterial:howtosetfloatPlaceholdertonever【发布时间】:2018-01-0822:58:08【问题描述】:库:Angular材质(material2)我想使用MdInputContainer的floatPlaceholder指令,以便占位符/提示永... 查看详情

Angular 9 - 删除 Angular Material Stepper 上的默认图标(创建)

】Angular9-删除AngularMaterialStepper上的默认图标(创建)【英文标题】:Angular9-Removedefaulticon(create)onAngularMaterialStepper【发布时间】:2020-07-0715:07:31【问题描述】:我在使用Angular时遇到了这个烦人的问题:我通过添加到页面的provides... 查看详情

如何使用 Angular Material 构建 Ivy?

】如何使用AngularMaterial构建Ivy?【英文标题】:HowtobuildIvywithAngularMaterial?【发布时间】:2019-11-0901:00:37【问题描述】:我正在使用Ivy和AngularMaterial,但是当我运行ngbuild时,我在下面遇到了这个问题:ERRORinTriedtooverwriteD:/Subin/PROJEC... 查看详情

如何创建响应式(可变列数)Angular-Material 卡片网格

】如何创建响应式(可变列数)Angular-Material卡片网格【英文标题】:Howtocreatearesponsive(varyingcolumncount)Angular-Materialcardgrid【发布时间】:2016-03-2010:45:18【问题描述】:我正在尝试创建一个Angular-Material卡片网格,其行为有点像Bootstr... 查看详情

Angular 5 / Material,如何在 Mat Dialog 中删除垂直滚动?

】Angular5/Material,如何在MatDialog中删除垂直滚动?【英文标题】:Angular5/Material,howtoremoveverticalscrollinMatDialog?【发布时间】:2018-10-0315:11:53【问题描述】:我正在尝试移除材质对话框中的垂直滚动。我正在尝试使用CSS.mat-dialog-contai... 查看详情

Angular 2 Material - 如何有条件地设置工具栏的颜色

】Angular2Material-如何有条件地设置工具栏的颜色【英文标题】:Angular2Material-howtosetthecolorofatoolbarconditionally【发布时间】:2017-07-2020:01:27【问题描述】:我正在使用AngularMaterialtoolbar,它可以有三种颜色:“primary”、“accent”或“... 查看详情

怎么评价angular推出的material,相比polymer如何

angular和polymer算是底层框架,material只是上层的一种组件实现方式,所以它们不太适合对比。换句话说,你用angular,polymer,甚至jQuery都能实现一套material的东西,只是各自的实现方式会有差异。说两者后期会整合的,不太看好,... 查看详情

如何使用样式组件覆盖material-ui css?

】如何使用样式组件覆盖material-uicss?【英文标题】:Howtooverridematerial-uicsswithstyledcomponent?【发布时间】:2021-09-1518:35:27【问题描述】:我还是ui-material的初学者。我想用styled-component自定义我自己的按钮组件。问题是根据按钮变... 查看详情

如何在 Material-UI 中使用 Box 组件覆盖按钮?

】如何在Material-UI中使用Box组件覆盖按钮?【英文标题】:HowtouseoverrideButtonusingBoxcomponentinMaterial-UI?【发布时间】:2020-07-1304:03:19【问题描述】:我一直在尝试在Material-UI中的Box组件上理解和编写代码。(https://material-ui.com/components/... 查看详情

如何从 angular-material2 对话框与其父级进行通信

】如何从angular-material2对话框与其父级进行通信【英文标题】:Howtocommunicatefromangular-material2dialogtoitsparent【发布时间】:2017-07-3117:54:59【问题描述】:我有一个Parent组件,它打开了一个angular-material2对话框。letdialogRef=this.dialog.open... 查看详情