AngularJs中的动态常量

时间:2015-07-14 08:25:39

标签: angularjs

对于那些对constants有更深入了解的人,有可能以某种方式动态分配它吗?

我知道这是一个愚蠢的问题但到目前为止我一直在使用常量来定义参数:

myApp.constant('Groupid', 10);

虽然这在生产开发中运行良好,但此参数将根据组进行更改。幸运的是,这可以在模块初始化之前,期间或期间确定。

所以,我正在考虑能够在.run().config()操作中设置此参数或仅.constant('Groupid', function(){})。但后者不起作用,因为constant只接受value / object作为其第二个参数。

作为可以看到的唯一替代方案,我可以使用directive,但在所有服务调用之间不必要地评估它的次数太多。虽然它是一个相当轻松和静态的功能,但仍然被调用了很多次......我更喜欢不断的任务。

这只是我现在必须忍受的事情,还是在隧道尽头有光?

另外

正如我发布这个问题一样,我想到了另一个想法。是否可以将自定义值/对象从外部传递到.module

var cusObj = { GroupId: getGroupId(), };
var myApp = angular.module('myApp', ['ui.router', 'ngResource', 'cusObj']);

3 个答案:

答案 0 :(得分:3)

提供商允许复杂的创建功能和配置选项。提供者实际上是可配置的工厂。提供者接受对象或构造函数。 您可以阅读所有选项here

app.provider('movie', function () {
    var version;
    return {
        setVersion: function (value) {
            version = value;
        },
        $get: function () {
            return {
                title: 'The Matrix' + ' ' + version
            }
        }
    }
});

app.config(function (movieProvider) {
    movieProvider.setVersion('Reloaded');
});

答案 1 :(得分:3)

除了接受的答案,我还想分享自己的用例,根据$window.location.origin设置一个值。在我的应用程序中,我需要使用此基本URL值为服务器返回的ID添加前缀,以便生成的链接${base_url}/${id}在开发和生产环境中都能正常工作。

var app = angular.module('app', []);

app.config(function ($provide, $windowProvider) {
  var $window = $windowProvider.$get();
  $provide.value('originUrl', $window.location.origin);
  // `originUrl` is set according to the server
  // that has served up the code
});

app.controller('MyController', function (originUrl) {
  expect(originUrl).toEqual('http://localhost:8080'); // e.g. for development
  expect(originUrl).toEqual('http://mysuperapp.com'); // e.g. for production
});

答案 2 :(得分:1)

装饰者可以修改或封装其他提供者。有一个例外,常量无法修饰。,因此您可以使用value中的angular

var app = angular.module('app', []);

app.value('movieTitle', 'The Matrix');

app.config(function ($provide) {
  $provide.decorator('movieTitle', function ($delegate) {
    return $delegate + ' - starring Keanu Reeves';
  });
});

app.controller('MyController', function (movieTitle) {
  expect(movieTitle).toEqual('The Matrix - starring Keanu Reeves');
});