【问题标题】:Storing application configuration settings存储应用程序配置设置
【发布时间】:2015-10-08 06:00:15
【问题描述】:

在 AngularJS 中存储应用程序配置设置的最佳位置是什么?这可能是应用程序常量、查找等内容,可以从控制器和服务或工厂中使用。我可以创建一个单独的服务来存储和检索这些东西,但我想知道是否还有其他合适的地方来存储和检索这些东西。

【问题讨论】:

    标签: javascript angularjs


    【解决方案1】:

    您可以使用constant() 提供程序!

    app.constant('myAppConfig', {ver: '1.2.2', bananas: 6, hammocks: 3, bananaHammocks: true});
    

    这与 Terry 的解决方案并没有太大的不同,但常量不会改变,因此它们会在其他提供程序之前应用。此外,该模块可以注入到您的配置函数中。

    app.config(function(myAppConfig){
        console.log(myAppConfig.bananaHammocks);
    });
    

    玩得开心

    【讨论】:

    • 太好了,谢谢。是的,我想知道是否有任何具体的内容。
    • bannanaHammocks...哈!!
    • 仅供参考,如果常量是一个对象,您可以更改常量内的值,例如在上面的例子中。阅读更多here
    • 我相信我们必须为提供的示例注入它。 app.config('myAppConfig', function(myAppConfig){ console.log(myAppConfig.bananaHammocks); });,否则您在控制台中有“未捕获的错误:[$injector:modulerr]”。
    【解决方案2】:

    不确定是否有“最佳方式”,但我个人使用服务,这是一个缩写示例:

    angular.module('myApp').factory('AppSettings', function() {
      return {
        language: 'en'
      }
    });
    
    angular.module('myApp').controller('myController', ['AppSettings', 
      function(AppSettings) {
        $scope.language = AppSettings.language;
      }
    ]);
    

    【讨论】:

    • 嗨,特里,我是个有棱角的菜鸟。我有我的 myApp.js。我假设它在那里,但我不确定我会得到设置。我将如何获得语言的价值?谢谢马克
    【解决方案3】:

    您也可以使用provider 代替service,并且在任何地方都可以轻松使用。

    angular.module('App', []).provider('config',
    function() {
        var conf = {
            ver: '1.2.2',
            bananas: 6,
            hammocks: 3,
            bananaHammocks: true,
            baseUrl:'data/'
        };
    
        conf.$get = function () {
            delete conf.$get;
            return conf;
        };
    
        return conf;
    });
    

    然后在配置中使用configProvider:

    angular.module('App').config( function(configProvider) {} );
    

    在运行中,控制器、服务等为config

    angular.module('App').run( function(config) {} );
    

    这是linkcode 的示例

    【讨论】:

      【解决方案4】:

      定义:

      angular.module('starter.config', [])
      .constant('appConfig', {
        'backend': 'http://localhost:3000/v1'
      });
      

      用法:

      angular.module('starter.services', ['starter.config'])
      
      .factory('Locations', function(appConfig, $http) {
        return {
          all: function(successCb, errorCb) {
            $http.get(appConfig.backend + '/locations.json')
            .success(successCb)
            .error(errorCb);
          },
          get: function(locationId, successCb, errorCb) {
            $http.get(appConfig.backend + '/locations/'+ locationId +'.json')
            .success(successCb)
            .error(errorCb);
          }
        };
      })
      

      【讨论】:

      • 所以每次您需要一些设置时,您需要发送 http 请求和/或存储您在其他地方获得的内容?似乎效率很低
      【解决方案5】:

      添加它以访问全局变量

      app.run(function ($rootScope) {
          $rootScope.globalVariable = 'Amadou'; //global variable
      });
      

      现在,如果您想从控制器中使用它

      function appNameCtrl($scope, $rootScope){
          $rootScope.globalVariable = 'Modji';
      }
      

      在你看来

      My name is {{globalVariable}}
      

      【讨论】:

      • 应避免使用任何类型的全局变量,尤其是当它们是变量时。配置是常量。
      • 为什么配置要保持不变?如果我想将语言配置应用于对某个端点的所有 api 调用怎么办?
      • @mameluc 然后使用服务,而不是全局变量。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-14
      • 2011-02-26
      • 2011-06-10
      • 2011-07-05
      • 1970-01-01
      • 2011-11-26
      • 2011-03-30
      相关资源
      最近更新 更多