覆盖angularJS中模块值/常量的最佳方式

Best way to override module values/constants in angularJS

本文关键字:常量 最佳 方式 angularJS 模块 覆盖      更新时间:2023-09-26

我用angularJS编写了一个模块,它封装了所有后端通信。为了获得更大的灵活性,我将api前缀作为模块上的常量值(可能是值,因为我在配置阶段没有使用它)。所以像这样的东西

angular.module('myapp.data').constant('apiPrefix', '/api/data');

现在我想从两个不同的应用程序中使用这个模块。其中一个使用/api1/data,另一个使用-api2/data,我想在应用程序的配置阶段更改这一点。我知道如何使用提供程序做到这一点,但让提供程序保存值对我来说似乎有些过头了。我可以从应用程序配置阶段修改使用的模块常量或值吗?

类似于:

angular.module("data", [])
.value('apiPrefix', '/api/data')
.factory('display', function(apiPrefix){
  return {
    pref: function(){
      console.log(apiPrefix);
      return apiPrefix;
    }
  }
});

angular.module("myApp",['data'])
.config(['apiPrefix', function(prefix){
  prefix = 'https:/api/data'; 
}])
.controller("Example", function($scope, display) {
   $scope.prefix = display.pref;
});

要覆盖模块值,可以在以后的模块中重新定义角度值。我认为这不应该在模块配置时完成。

angular.module("data", [])
.value('apiPrefix', '/api/data')
.factory('Display', function(apiPrefix){
  return {
    pref: function(){
      return apiPrefix;
    }
  }
});


angular.module('myapp', ['data'])
  .value('apiPrefix', '/api2/data')
  .controller('MainCtrl', function($scope, Display)    {
      $scope.name = Display.pref();
  });

请参阅此处的plunker:http://plnkr.co/edit/k806WE

同样的道理也适用于角常数。

我们的模块

angular.module("data", [])
  .constant('apiPrefix', '/api/data');

我们可以像value一样完全覆盖constant

angular.module('myapp', ['data'])
  .constant('apiPrefix', '/api2/data');

我们也可以在config 中完全覆盖

angular.module('myapp', ['data'])
    .config(function ($provide) {
        $provide.constant('apiPrefix', '/api2/data');
    });

我们也可以在run 中完全或部分覆盖(如果对象)

angular.module('myapp', ['data'])
    .run(function (apiPrefix) {
        apiPrefix = '/api2/data';
    });

但是,如果我们想用部分处于配置(未运行)中的对象覆盖constant,我们可以做这样的

angular.module("module1", [])
    .constant('myConfig', {
        param1: 'value1' ,
        param2: 'value2'
    });
angular.module('myapp', ['data'])
    .config(function ($provide, myConfig) {
        $provide.constant(
            'myConfig', 
            angular.extend(myConfig, {param2: 'value2_1'});
        );
    });

角度模块、控制器等可以包含在函数、if语句等中。它们不必位于顶级。所以,你可以在你的代码中包括这一点:

if (environmentOne()) {
  module.value('apiPrefix','api1/data');
} else {
  module.value('apiPrefix','api2/data');
}

希望能有所帮助!