如何在AngularJS控制器中获取特定于环境的URL?

时间:2014-12-17 02:25:58

标签: javascript jquery asp.net-mvc angularjs razor

情况

我们生产的Web项目有一个如下所示的根URL:http://example.com。我们的本地开发实例(不要问我原因)默认为这样的URL:http://localhost/SubDir其中SubDir是IIS中实际虚拟子目录的占位符。

这不是问题。尽管我想废除那个子目录URL的东西,但这只是说明了一个问题。如果我们稍后要迁移到包含子目录URL的不同域或URL,那么对于我们使用帮助程序生成URL的代码中的所有实例(例如@Url.Action("GetUpdates")等),这不会成为问题。

目前我们有相当多的javascript被移动到外部.js文件,这些文件使用jQuery从隐藏的输入中获取URL字符串,其值已设置为如上所述的Url助手。这不是太糟糕,它有效。

问题

AngularJs。这不是问题。然而,它已经发现了这个问题。我们想最终从项目中删除jQuery。现在,我正在使用jQuery在我的控制器中获取URL(如果我可以合理地保证我将有时间在以后修复它,我愿意打破规则以便及时获得某些东西)。现在是修复它的时候了,我很茫然。

在这两种环境之间,我从@Url.Action("GetUpdates")获得以下内容:

  • http://example.com/:=> /Contest/GetUpdates
  • http://localhost/SubDir:=> /SubDir/Contest/GetUpdates

问题

如何在不使用该控制器文件中的帮助程序的情况下将依赖于环境的URL放入我的AngularJs控制器中?我原本以为它可能就像使用隐藏的输入和设置ng-model一样简单,但似乎没有用。我还研究过使用扩展RazorJS,但希望有更好的方法可以更好地使用Angular范例。

有人有什么想法吗?如何将URL导入控制器?

1 个答案:

答案 0 :(得分:1)

如果您能够更改环境配置服务器端,则可以将变量内联在模块中。然后你可以注入你的主应用程序。

这是 Plunker

// inline
angular.module('Preload',[]).contstant('CONFIG', {'BASE_URL':'http://localhost/foo'});

// inject
var app = angular.module('MainApp', ['Preload']);

// Controller
app.controller('MainCtrl', function($scope, CONFIG) {
  $scope.base_url = CONFIG.BASE_URL;