【问题标题】:Accessing $rootScope content in factory return undefined访问工厂中的 $rootScope 内容返回 undefined
【发布时间】:2016-09-20 01:27:17
【问题描述】:

我很困惑。

首先,我在 Ionic 1+ 中观察到这一点(但我认为这可能与 AngularJS 有关)

我创建了一个工厂,注入了 $rootScope。

在我的 app.js 中,我已经分配了一个变量,说

 var app = angular.module('my-module',
     app.run(['$rootScope', ...

         $rootScope.strUrl = 'http://localhost:30000'

然后我需要在工厂内部使用这个变量。准确的说,就是在加载之后访问它。

 angular.module('my-module')
        .factory('myFactory', ['$rootScope', ...]);
 function myFactory($rootScope, ...){
     var objUrl = {
                     baseUrl: $rootScope.strUrl,
                     ....
     }
 }

令我困惑的是,当我在工厂内访问 $rootScope.strUrl 时,它返回未定义。但是,在此之前只有一行,我可以 console.log($rootScope.strUrl) 返回我想要的字符串。

是不是不能访问工厂内部的$rootScope内容?

【问题讨论】:

  • 如果您的问题已解决,请删除该问题。如果不是,请改写你的问题,因为它没有意义。
  • 这个问题应该如何改写?它实际上显示了我观察到的内容。
  • 如果我们要提供帮助,我们需要了解您在哪里设置 rootScope.strUrl = 'http://localhost:30000' 。说它在app.js 对我们没有任何帮助。
  • 好的。问题已编辑。谢谢提醒。
  • 上面的app是什么模块?

标签: angularjs ionic-framework factory


【解决方案1】:

嗯...我想我知道出了什么问题。是顺序的问题。

angularjs 在运行 app.run(['$rootScope',...]

之前会先通过我的工厂

然而,console.log 有点误导。

【讨论】:

    【解决方案2】:

    如果您的目标是设置“配置”,您有两个更好的选择。最简单的方法是使用constant,如果您偏执,请使用value,如果您想要手提钻,请使用provider。下面是一个如何使用常量的示例,提供者和服务都可以访问该常量。提供程序更复杂,但如果您使用一个,您可以使用应用程序的config 步骤设置/配置它。

     var app = angular.module('my-module', []);
    
     app.constant('settings', {strUrl : 'http://localhost:30000'});
    
     app.factory('myFactory', myFactory);
     function myFactory(settings){
          var objUrl = {
                     baseUrl: $settings.strUrl,
                     ....
    
          }
     }
    

    请参阅AngularJS 文档以获得更详细的说明。


    至于您的“问题”取决于您在运行中访问的内容,以及您从 myFactory 返回的内容,您可能会遇到问题。如果您的.run 方法引入了一个依赖于myFactory 的依赖项,那么digest 在注入您的myFactory 时将没有时间完成。我不认为你拥有它的方式是理想的,过去我使用constants 和providers 来配置我的应用程序。我们有一个开源库,可以为您做您想做的事情。但是文档非常缺乏;)

    https://bitbucket.org/unboxedtech/angular.core/src/e2b1b8dd9457de7b334655f09410da1a78fb55c8/app/src/urls/?at=master

    基本上你定义一个设置对象:

    app.constant('settings', {
        base: 'http://localhost:30000/'
    });
    

    在运行步骤中添加我们的UrlInterceptor 拦截器。

    它允许您执行以下操作:

    $http('~/someresource') 
    // which translates to http://localhost:3000/someresource
    
    
    $http('~(api)/someendpoint') 
    // which translates to http://localhost:3000/api/someendpoint
    

    它也适用于模板和任何其他 http 依赖服务。

    【讨论】:

      猜你喜欢
      • 2019-04-28
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2011-01-15
      • 2015-01-09
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      相关资源
      最近更新 更多