Javascript 如何扩展/覆盖角度材质$mdDialog.show中的默认选项?

Javascript 如何扩展/覆盖角度材质$mdDialog.show中的默认选项?,javascript,angularjs,decorator,angular-material,Javascript,Angularjs,Decorator,Angular Material,TL;DR:我需要一种方法来覆盖使用提供程序(与任何其他角度模块一样)提供给我的角度材质的默认选项(尤其是在“材质”对话框中) 我一直在寻找一种自定义默认值的方法,但没有任何可用的结果 就像我在其他插件/模块上使用的那样,这种方式可以通过提供程序来实现。查看材料的核心(1.0.8),我尝试使用setDefaults方法设置选项,如下所示(假设我只想暂时禁用背景): 现在,当我检查onCompletecallback上的选项时: 因此,正如您所看到的,hasbackup选项已更新,但模式不再工作

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

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

就像我在其他插件/模块上使用的那样,这种方式可以通过
提供程序来实现。查看材料的核心(1.0.8),我尝试使用
setDefaults
方法设置选项,如下所示(假设我只想暂时禁用背景):

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

因此,正如您所看到的,
hasbackup
选项已更新,但模式不再工作,因此我认为我遗漏了一些内容

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

谢谢

更新:没有
的选项对象。设置默认值
处于活动状态(取消初始状态)


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

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

Angular在配置应用程序时,使用
提供程序上的
装饰程序
提供了一种简洁的方法

$provide.decorator

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

您可以为
$mdDialogProvider
编写装饰程序,以扩展
.show
方法的功能,并将扩展的
选项
对象传递给它,如下所示:

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

我已经用
{hasBackground:false}
创建了一个代码笔,这样在调用
$mdDialog.show()

时不会显示背景,请在此处找到带有演示的代码笔:

这是服务的外观:

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

你能再解释一下你到底想达到什么目的吗?对于这个任务,也许可以有一个更透明的方式来完成它,然后点击原始服务请查看我的更新。我只需要一种更新默认材质选项的方法。现在,比方说,如果我想删除所有模块的background,我必须在每个
show
show实例上调用它,而不是将
hascardback:false
添加为我现在看到的所有模块的全局选项。在我看来,您可以通过创建一个模态工厂来实现这一点,该工厂将使用更新的属性包装角材质模态。我将尝试制作一个plunk幻觉来说明我的意思我已经为此制作了一种包装服务,但我很好奇是否可以使用提供者,这似乎是angular的“正确方式”。我还将用我的服务更新代码。无论如何,在回答中加上这个,它可以用比我更好的方式来完成。关于这一点,有一个小提示:
var args=angular.extend({},arguments[0],{hascardback:false})
。我将更改顺序,以确保特定于模式的选项将覆盖我的自定义默认值,因此将变为:
var args=angular.extend({},{hascardback:false},arguments[0])
。此外,对于更清晰的代码,可以在变量DAgreed中定义具有默认值的对象。但这是对解决方案的优化:)很好的解决方案!可能您需要检查
参数[0]。\u如果对话框是从
预设创建的,请选择
   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);
      }