angularjs - 在 AngularJS 中以编程方式在运行时替换服务

标签 angularjs dependency-injection angularjs-injector

出于测试目的,我想替换网络应用程序在运行时具有的一项服务。有一个连接到外部服务的服务在某些本地环境中不可用,我想只执行一个命令将其替换为模拟。

我已经看到我可以在运行时通过调用从 AngularJS 获得任何服务:

> angular.element('html').injector().get('myService')

但我想知道是否有办法用其他东西替换“myService”。

我知道创建一个公开“myService”的“myServiceWrapper”可以让我通过以下操作轻松替换它:

> angular.element('html').injector().get('myServiceWrapper').myService = new Whatever();

但我想避免对已经运行的应用程序进行更改。

最佳答案

您有几个选择。首先,您可以只声明一个具有相同名称的新服务(在已声明原始服务之后)。由于 Angular 目前没有命名空间的概念,您的新服务将覆盖旧服务。

其次,您可以使用 decorator修改部分服务。

最后,ngMockE2E模块还可以让您将 $httpBackend 换成一个模拟的,以使用当前存在的服务,但停止对外部提供商的任何调用。

关于angularjs - 在 AngularJS 中以编程方式在运行时替换服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23789193/

相关文章:

javascript - 第一个完成后使用不同参数调用相同的 $http 函数,在 AngularJS 中使用 Factory

javascript - AngularJs 模板未在 Internet Explorer 8 中加载

java - 使用注释(Inject、Autowired)或使用 getBean 在 Spring 中创建对象

c# - Ninject:注入(inject)内部扩展方法

c# - 将组件列表解析为构造函数参数

AngularJs - 注入(inject) $scope

javascript - 如何计算 AngularJs 对象中的总值和空值

angularjs - 在服务中使用 $httpBackend 进行测试

angularjs - 创建一个通用的 angularjs listController

javascript - Angular JS 错误 : [$injector:modulerr]