我正在学习angular-ui代码的模式。它们通常将默认选项定义为特定于组件的模块上的常量,如下所示:
angular.module('ui.bootstrap.buttons', [])
.constant('buttonConfig', {
activeClass: 'active',
toggleEvent: 'click'
})
https://github.com/angular-ui/bootstrap/blob/master/src/buttons/buttons.js#L3
这是一个我可以使用包含模块中的常量覆盖的模式吗?
angular.module('app', ['ui.bootstrap.buttons']).constant('buttonConfig',{
activeClass: 'selected'
});
如果没有,我认为这种模式没有大量使用,并且想要了解他们使用它的原因。对于手风琴,常量的扩展需要大量的代码:
var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;
https://github.com/angular-ui/bootstrap/blob/master/src/accordion/accordion.js#L14
答案 0 :(得分:1)
如果将常量注入模块的配置函数,则应该能够设置所需对象的任何属性。例如:
angular.module('app', ['ui.bootstrap.buttons']).config(["buttonConfig", function (buttonConfig) {
buttonConfig.activeClass: 'selected'
}]);
如果您只是重新定义常量,那么您将摆脱该常量对象上的其他属性(在您的情况下,toggleEvent将不再可用)。这是一个jsfiddle我把它放在一起来演示将常量对象的activeClass属性从“active”更改为“selected”的能力。
该行:
var closeOthers = angular.isDefined($attrs.closeOthers) ? $scope.$eval($attrs.closeOthers) : accordionConfig.closeOthers;
不是扩展常量,而是覆盖它。这就是说,如果将close-others属性放在指令上而不是使用它,则返回到常量中定义的内容。通过在配置中使用常量,您可以设置在这些属性不在指令之外时使用的默认值。
答案 1 :(得分:1)
是的,您可以覆盖包含模块中的常量。事实上,您可以覆盖包含模块中的任何内容。这就是模块在Angular中的工作方式。
这里有一个小demo。
var app = angular.module('myApp', ['specific']),
specificApp = angular.module('specific', []);
app.constant('active', {from: 'app'});
specificApp.constant('active', {from: 'specific'});
app.controller('AppCntrl', function($scope, active) {
console.log('from AppCntrl: '+active.from); // displays 'app'
});
specificApp.controller('SpecificAppCtrl', function($scope, active) {
console.log('from SpecificAppCtrl: '+active.from); // displays 'app'
});