在工厂中访问$ rootScope内容返回undefined

时间:2016-09-20 01:27:18

标签: angularjs ionic-framework factory

我很困惑。

首先,我在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时,它返回undefined。但是,在此之前只有一行,我能够console.log($rootScope.strUrl)返回我想要的字符串。

是否无法访问工厂内的$ rootScope内容?

2 个答案:

答案 0 :(得分:0)

嗯......猜我知道出了什么问题。这是序列问题。

在运行app.run之前,

angularjs会首先通过我的工厂([' $ rootScope',...]

然而,console.log有点误导。

答案 1 :(得分:0)

如果你的目标是设置“配置”,你有两个更好的选择。最简单的方法是使用constantvalue(如果你的偏执狂)和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时将没有时间完成。我不认为你拥有它的方式是理想的,过去我使用constantsproviders来配置我的应用程序。我们有一个开源库,可以帮助您完成您的工作。但文档非常缺乏;)

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依赖服务。