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