首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Angular2 Dart:在包中划分项目不允许使用修改后的提供程序重用基本组件

Angular2 Dart:在包中划分项目不允许使用修改后的提供程序重用基本组件
EN

Stack Overflow用户
提问于 2017-08-29 08:55:55
回答 1查看 61关注 0票数 1

我有一个大的应用程序使用Dart (1.24.2)和角省道(3.1.0)。我决定将应用程序分成两个包:第一个是基础层,第二个是真正的应用程序包。其思想是能够在其他项目中重用基础层。在基础层中,我使用了几个服务(提供者),这些服务(提供者)对应用程序是全局的,并且被广泛使用。现在,在应用程序层中,我需要向一些服务添加一些字段。我遇到的问题是,您不能使用基础层中使用修改过的服务的组件。我得到的信息是:“异常:找不到提供者。”我不能说这是错误,但这将有助于创建角模块。举个例子。我使用Angular2生成了一个示例应用程序: Todo应用程序。鉴于此,我修改了"src/todo_list/todo_list_component.dart“源代码,删除了TodoListService提供程序。

代码语言:javascript
复制
  //providers: const [TodoListService],

并将声明移到AppComponent类中:

代码语言:javascript
复制
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中添加了一个字段:

代码语言:javascript
复制
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的引用:

代码语言:javascript
复制
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)

还有别的办法吗?是否有可能改变这种行为的角度,以便也可以注入一个子类的提供者,而不是原来的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-08-29 09:01:53

您可以使用

代码语言:javascript
复制
providers: const [
    materialProviders, 
    const Provider(base.TodoListService, useClass: TodoListService)
],

然后,当某个类依赖于base.TodoListService时,角将注入子类TodoListService,该子类将与被调用的构造函数兼容,因为它是一个子类。

TodoListService本身就是const Provider(TodoListService, useClass: TodoListService)的一个简短形式(可能会在角5中终止)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45934718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档