当前位置: 首页 > 知识库问答 >
问题:

使用$HTTP.GET调用响应初始化AngularJS常量

臧兴学
2023-03-14

例如:-

    angular.module('A',[]);
    angular.module('A').run( function ($rootScope,$http){
      $rootScope.safeApply = function (fn) {

                $http.get('url').success(function(result){

                    // This doesn't work. I am not able to inject 'theConstant' elsewhere in my application
                    angular.module('A').constant('theConstant', result);
                });                   
                var phase = $rootScope.$$phase;
                if (phase === '$apply' || phase === '$digest') {
                    if (fn && (typeof (fn) === 'function')) {
                        fn();
                    }
                } else {
                    this.$apply(fn);
                }
            };
      });

我想在我的应用程序初始化的时候设置这个常数,并且能够在我的组件之间共享这个常数。

什么是实现这一目标的最佳方法?

共有1个答案

嵇浩然
2023-03-14

初始化应用程序时,$http.get的结果不可用。只有在服务器交付时才可用。因此,简单地将该值保持在模块常量中是不可能的。你冒着

但是,您可以做的是将对$http.get的调用包装在一个服务中,并将该服务注入到您需要常量的任何地方。(请注意,不能在配置块中注入服务。)

// grab the "constant"
angular.module('A').factory('almostConstant', function () {
  return $http.get('url').then(function(response) {
    return response.data;
  });
});

// use the "constant"
angular.module('A').controller('controller', function($scope, almostConstant) {
  almostConstant.then(function(data){
    $scope.almostConstant = data;
  });  
});

访问almostConstant值的模式有点尴尬,这是由于它的异步性质。它只是在一个未指定的时间可用,所以试图以同步方式访问它可能会引入很多微妙的定时错误。

一种非常不偏颇的方法是直接在JS文件中写入常量。此时,您的服务器可以用一个值来回答对'url'的请求。相反,您可以使用以下字符串使它响应对'url.js'的请求:

angular.module('A').constant('theConstant', result);

结果显然是你的常量。例如,如果您在后端使用php,它可能如下所示:

<?php
   header('Content-Type: application/javascript');
   $constant = retrieveMyConstant();
?>
angular.module('A').constant('theConstant', <?php echo $constant; ?>);

确保常量实际上看起来像JavaScript值。如果是字符串,则将其包装在'中,如果是JSON对象,则编写其序列化,等等。

之后,只需在index.html文件中包含一个指向url.js的脚本标记。

注意,这个解决方案是同步的,所以如果在服务器上检索常量需要一段时间,就会影响您的页面加载时间。

 类似资料:
  • 问题内容: 我有一个AngularJs应用程序,我想在其中一开始就加载消息和应用程序版本,并将它们保存在本地存储中,然后再在控制器中使用它们。我现在所拥有的是每个控制器中的服务调用(目前为三个): 我只想获取一次应用程序版本并将其存储在此处。我不必每次都检查版本,对(如果新版本中添加了新消息)? 我发现使用$routeProvider的建议,但我的应用程序不是SPA。所以我需要其他想法/建议。对你

  • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA

  • 问题内容: 我正在尝试使用AngularJS 1.1.5的ng- repeat从选择框开始使用预填充选项。相反,选择始终始于未选择任何内容。它还有一个空选项,我不想要。我认为没有选择任何东西都会带来副作用。 我可以使用ng-options代替ng-repeat来工作,但在这种情况下我想使用ng- repeat。尽管我缩小的示例没有显示出来,但我也想设置每个选项的title属性,据我所知,没有办法使

  • 问题内容: 为了确定用户的会话是否已通过身份验证,我需要在加载第一个路由之前向服务器发出$ http请求。在加载每个路由之前,身份验证服务会检查用户的状态以及该路由所需的访问级别,如果未对该用户进行身份验证,它将重定向到登录页面。但是,当首次加载该应用程序时,它并不了解用户,因此,即使他们具有经过身份验证的会话,它也将始终重定向到登录页面。因此,为了解决此问题,我正在尝试向服务器发出用户状态请求,

  • 我有一个AngularJS服务,我想用一些异步数据初始化它。类似这样的事情: 显然,这是行不通的,因为如果在返回之前,有东西试图调用,我将得到一个空指针异常。据我所知,从这里和这里所问的其他一些问题中,我有几个选择,但没有一个看起来很清楚(也许我遗漏了什么): 使用“运行”设置服务 设置应用程序时,请执行以下操作: 那么我的服务将如下所示: 这在某些时候起作用,但如果异步数据的时间恰好比初始化所有

  • 问题内容: 我有一个AngularJS服务,我想使用一些异步数据进行初始化。像这样: 显然,这是行不通的,因为如果在返回之前尝试进行调用,我将得到一个空指针异常。据我从阅读这里和这里提出的其他一些问题中所知道的,我有一些选择,但是它们似乎都不是很干净(也许我错过了一些东西): 安装服务“运行” 设置我的应用程序时,请执行以下操作: 然后我的服务将如下所示: 这有时会起作用,但是如果异步数据恰好比初