Angularjs 我应该如何访问DI生命周期之外的angular服务(特别是rootScope)?
简而言之,我正试图将一些不是为angular(特别是angular)编写的数据模型代码引入angular应用程序。这段代码是使用ES6模块导入/导出语法编写的,我希望继续使用它。所以我有点像:Angularjs 我应该如何访问DI生命周期之外的angular服务(特别是rootScope)?,angularjs,ecmascript-6,Angularjs,Ecmascript 6,简而言之,我正试图将一些不是为angular(特别是angular)编写的数据模型代码引入angular应用程序。这段代码是使用ES6模块导入/导出语法编写的,我希望继续使用它。所以我有点像: export class DataModel { //some stuff with promises } 我所做的是创建一个实用程序模块,向ES6模块系统公开相关的Angular(1.5)服务,因此: import angular from 'angular'; export const serv
export class DataModel {
//some stuff with promises
}
我所做的是创建一个实用程序模块,向ES6模块系统公开相关的Angular(1.5)服务,因此:
import angular from 'angular';
export const services = {};
angular.injector(['ng', 'toastr']).invoke([
'$q',
'$http',
'$rootScope',
(
$q,
$http,
$rootScope
) => {
services.$q = $q;
services.$http = $http;
services.$rootScope = $rootScope;
},
]);
然后我就可以将$q库导入到我的DataModel类中,嘿,presto,一切都很好——我在做承诺,当.Then方法启动时,相应的作用域应该更新
问题是这实际上不起作用。我90%确信这不起作用的原因是,我从angular.injector调用中得到的$rootScope元素不是一个单例rootScope,它是一个新的仅为这个上下文创建的元素。它不与页面上的实际作用域共享任何作用域链接(我可以通过选择DOM元素并将services.$rootScope与angular.element($0.scope().$root)进行比较来确认这一点)。因此,当承诺解析或$http返回时,我会得到数据,但标准症状是不通知接口中的范围摘要(在我手动触发摘要之前,不会发生任何更改)
我真正想要的是angular在活动页面中实时使用的$q、$rootScope和$http服务的副本。欢迎提出任何建议。我的下一次尝试将是看看是否可以从一些程序中获取相关服务。运行block,在其中注入$q等,而不是使用注入器。不过,这会带来一些时间问题,因为我需要引导、运行run块,然后将服务公开给我的数据模型。但是引导过程需要数据模型。这有点循环。我现在自己来回答这个问题,但我希望看到其他想法 我将angularServices代码更改为:
import angular from 'angular';
import { Rx } from 'rx-lite';
export const servicesLoaded = new Rx.Subject();
export const services = {};
angular.module('app.services', []).run([
'$q',
'$http',
'$rootScope',
(
$q,
$http,
$rootScope
) => {
services.$q = $q;
services.$http = $http;
services.$rootScope = $rootScope;
servicesLoaded.onCompleted();
},
]);
因为我已经在使用rx lite了。这让我可以做到
import { services } from 'angularServices';
services.$http(options) // etc;
每当我在应用程序引导周期之后运行的代码中工作时。对于过早运行的代码(只是一些地方的配置内容),我将其包装在RxJS事件中:
import { services, servicesLoaded } from '../../common/angularServices';
servicesLoaded.subscribeOnCompleted(() => {
services.$rootScope.$on('$stateChangeSuccess', () => {
//etc
这样,在$rootScope或$window实际存在之前,我不会尝试与它取得联系,但是我在服务对象中隐藏的$q、$rootScope和$http实际上是一个真实的对象,并正确地消化了所有的fire
现在,嘿,普雷斯托,虽然我的模型层引用了$http和$q,但它们很容易与其他promises和XHR提供商交换,使我投入的所有工作都不局限于angular 1.x.Whee。我现在自己回答这个问题,但我很想看到其他想法
我将angularServices代码更改为:
import angular from 'angular';
import { Rx } from 'rx-lite';
export const servicesLoaded = new Rx.Subject();
export const services = {};
angular.module('app.services', []).run([
'$q',
'$http',
'$rootScope',
(
$q,
$http,
$rootScope
) => {
services.$q = $q;
services.$http = $http;
services.$rootScope = $rootScope;
servicesLoaded.onCompleted();
},
]);
因为我已经在使用rx lite了。这让我可以
import { services } from 'angularServices';
services.$http(options) // etc;
每当我在应用程序引导周期后运行的代码中工作时。对于过早运行的代码(只是一些地方的配置内容),我将其包装在RxJS事件中,因此:
import { services, servicesLoaded } from '../../common/angularServices';
servicesLoaded.subscribeOnCompleted(() => {
services.$rootScope.$on('$stateChangeSuccess', () => {
//etc
这样,在$rootScope或$window实际存在之前,我不会尝试与它取得联系,但是我在服务对象中隐藏的$q、$rootScope和$http实际上是一个真实的对象,并正确地消化了所有的fire
现在,嘿,普雷斯托,虽然我的模型层引用了$http和$q,但它们将很容易与其他promises和XHR提供商交换,使我投入的所有工作都不受angular 1.x.Whee的约束。也许你应该引导一个应用程序,然后继续它的根范围。已经有一个应用程序引导,问题是在那里生成的rootscope与通过注入器手动调用rootscope时生成的rootscope不同。我想我只需要在进程上放置某种信号量,在其引导过程中获取应用程序的实际rootscope、q、http和其他服务,并使用该信号量冻结/解冻数据模式l的启动过程。也许你应该引导一个应用程序,然后继续它的根范围。已经有一个应用程序引导了,问题是在那里生成的根范围与你通过注入器手动调用根范围时生成的根范围不同。我想我需要在这个过程中添加一些信号,在其引导过程中获取应用程序的实际rootScope、q、http和其他服务,并使用信号量冻结/解冻数据模型的启动过程。