我有一个大的应用程序使用Dart (1.24.2)和角省道(3.1.0)。我决定将应用程序分成两个包:第一个是基础层,第二个是真正的应用程序包。其思想是能够在其他项目中重用基础层。在基础层中,我使用了几个服务(提供者),这些服务(提供者)对应用程序是全局的,并且被广泛使用。现在,在应用程序层中,我需要向一些服务添加一些字段。我遇到的问题是,您不能使用基础层中使用修改过的服务的组件。我得到的信息是:“异常:找不到提供者。”我不能说这是错误,但这将有助于创建角模块。举个例子。我使用Angular2生成了一个示例应用程序: Todo应用程序。鉴于此,我修改了"src/todo_list/todo_list_component.dart“源代码,删除了TodoListService提供程序。
//providers: const [TodoListService],并将声明移到AppComponent类中:
import 'src/todo_list/todo_list_service.dart';
// AngularDart info: https://webdev.dartlang.org/angular
// Components info: https://webdev.dartlang.org/components
@Component(
selector: 'my-app',
styleUrls: const ['app_component.css'],
templateUrl: 'app_component.html',
directives: const [materialDirectives, TodoListComponent],
providers: const [materialProviders, TodoListService],
)
class AppComponent {这样,服务对AppComponent调用的所有组件都是全局的。
然后,我生成了第二个项目,始终是一个TodoList示例,并进行了与前面相同的修改(全球化TodoListService)。
现在,在派生包中,我执行了以下操作:添加了对基础层包的引用;取消了src/todo_list/todo_list_component.dart、.css和.html。这是因为我想使用基础层包TodoList组件。在TodoListService中添加了一个字段:
import 'package:angular2/core.dart';
import 'package:angular_inject_subclass_base/src/todo_list/todo_list_service.dart' as base;
/// Mock service emulating access to a to-do list stored on a server.
@Injectable()
class TodoListService extends base.TodoListService {
String description;
}最后一次修改,在AppComponent源代码中,我更改了对基础层的TodoListComponent的引用:
import 'package:angular_inject_subclass_base/src/todo_list/todo_list_component.dart';试图运行派生项目时,我得到了以下错误:
(匿名函数)异常:没有为TodoListService找到提供程序。STACKTRACE
0 (package:angular2/src/core/di/injector.dart:54:7) _EmptyInjector.get
1 (package:angular2/src/core/di/injector.dart:73:52) 2 ReflectiveInjectorImpl._getByKeyDefault (package:angular2/src/core/di/reflective_injector.dart:816:18)
3 (package:angular2/src/core/di/reflective_injector.dart:782:14) 3 ReflectiveInjectorImpl._getByKey
4 (package:angular2/src/core/di/reflective_injector.dart:529:17) ReflectiveInjectorImpl.get
5 (package:angular2/src/core/linker/app_view.dart:236:37) AppView.injectorGet
6 (package:angular2/src/debug/debug_app_view.dart:98:31) DebugAppView.injectorGet
构建(package:angular_inject_subclass_derived/app_component.template.dart:90:71) 8 AppView.create (package:angular2/src/core/linker/app_view.dart:180:12)
还有别的办法吗?是否有可能改变这种行为的角度,以便也可以注入一个子类的提供者,而不是原来的?
发布于 2017-08-29 09:01:53
您可以使用
providers: const [
materialProviders,
const Provider(base.TodoListService, useClass: TodoListService)
],然后,当某个类依赖于base.TodoListService时,角将注入子类TodoListService,该子类将与被调用的构造函数兼容,因为它是一个子类。
仅TodoListService本身就是const Provider(TodoListService, useClass: TodoListService)的一个简短形式(可能会在角5中终止)
https://stackoverflow.com/questions/45934718
复制相似问题