在AngularJS中,哪些模块可以覆盖常量?

时间:2014-04-22 18:08:30

标签: javascript angularjs angular-ui-bootstrap

我正在学习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

2 个答案:

答案 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'
});