在AngularJS表达式中调用全局变量

时间:2012-10-05 15:06:36

标签: javascript angularjs

我在head标签中有一些全局变量:

<script type="text/javascript">
    var apiRoot = 'http://localhost:8000/api',
        apiUrl = apiRoot,
        apiBadgeUrl = apiRoot + '/badges',
        apiLevelUrl = apiRoot + '/levels',
        apiBehaviorUrl = apiRoot + '/behaviors',
        apiTrophyUrl = apiRoot + '/trophies',
        apiUserUrl = apiRoot + '/users',
        apiWidgetPreferencesUrl = apiRoot + '/widgetPreferences';
</script>

我想在html文件中使用角度表达式,但我的尝试失败了:

{{ $window.apiRoot }} or {{ apiRoot }} 

3 个答案:

答案 0 :(得分:6)

这些表达式是针对当前范围进行评估的。如果您尚未通过控制器在示波器中设置它们,则无法进行评估。见http://docs.angularjs.org/guide/expression

示例:

function MyCtrl($scope)
{
   $scope.apiRoot = apiRoot;
}

HTML:

<div ng-controller="MyCtrl">
   {{apiRoot}}
</div>

如上所述,虽然上述示例有效,但不建议使用。更好的方法是在服务中设置这些变量,然后让它们通过服务。

function MyCtrl($scope, apiRootService)
{
   $scope.apiRoot = apiRootService.getApiRoot();
}

服务:

angular.module('myServices', []).factory('apiRootService', function() {
    var apiRoot = 'http://localhost:8000/api',
    apiUrl = apiRoot,
    apiBadgeUrl = apiRoot + '/badges',
    apiLevelUrl = apiRoot + '/levels',
    apiBehaviorUrl = apiRoot + '/behaviors',
    apiTrophyUrl = apiRoot + '/trophies',
    apiUserUrl = apiRoot + '/users',
    apiWidgetPreferencesUrl = apiRoot + '/widgetPreferences';
    return {
      getApiRoot: function() {
         return apiRoot
      },
      //all the other getters
   });

答案 1 :(得分:1)

最佳做法是将apiRoot移动到服务并将该服务注入您的控制器。请参阅here

答案 2 :(得分:0)

另一种方法是将全局内容添加到$ rootScope。 您可以通过在应用模块定义中添加以下内容来实现此目的

angular.module('myApp', ['ngRoute'])
    .run(function ($rootScope){
        $rootScope.myAPI = {
             apiRoot: 'http://localhost:8000/api',
             apiUrl: apiRoot,
             apiBadgeUrl: apiRoot + '/badges',
             apiLevelUrl: apiRoot + '/levels',
             apiBehaviorUrl: apiRoot + '/behaviors',
             apiTrophyUrl: apiRoot + '/trophies',
             apiUserUrl: apiRoot + '/users',
             apiWidgetPreferencesUrl: apiRoot + '/widgetPreferences'
        }
    });


虽然服务确实有效,但角度文档建议不要这样做。 http://docs.angularjs.org/misc/faq

  

相反,不要创建一项服务,其唯一目的是存储和返回数据。