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

mas*_*plo 11 javascript angularjs

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

angular.module('myapp.data').constant('apiPrefix', '/api/data');
Run Code Online (Sandbox Code Playgroud)

现在我想从两个不同的应用程序中使用这个模块.一个使用/ 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;
});
Run Code Online (Sandbox Code Playgroud)

kha*_*zan 12

要覆盖模块值,您可以在以后的模块中重新定义角度值.我相信它不应该是模块配置时间.

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();
  });
Run Code Online (Sandbox Code Playgroud)

请看这里的plunker:http://plnkr.co/edit/k806WE

同样的事情也适用于角度常数.

  • 好的解决方案 我有点不好,我不知道,因为我可能会意外地覆盖模块常量或值,因为我经常使用它们.好事我总是试图创建独特的描述性名称. (2认同)

Ale*_*eev 9

我们的模块

angular.module("data", [])
  .constant('apiPrefix', '/api/data');
Run Code Online (Sandbox Code Playgroud)

我们可以constant完全覆盖,比如value.

angular.module('myapp', ['data'])
  .constant('apiPrefix', '/api2/data');
Run Code Online (Sandbox Code Playgroud)

我们也可以完全覆盖 config

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

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

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

但是如果我们想constant在config中部分覆盖对象(不是在运行中),我们可以做这样的事情

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'});
        );
    });
Run Code Online (Sandbox Code Playgroud)