dart - Angular2 Dart : Dividing a project in packages does not allow to reuse base components with modified providers

标签 dart packages angular-dart

我有一个使用 Dart (1.24.2) 和 angular dart (3.1.0) 的大型应用程序。
我决定将应用程序分成两个包:第一个是基础层,第二个是真正的应用程序包。这个想法是能够在其他项目中重用基础层。
在基础层中,我使用了几个服务(提供者),它们对应用程序来说是全局的并且被广泛使用。
现在,在应用层,我需要为一些服务添加一些字段。
我遇到的问题是您不能使用使用修改的服务的基础层组件。我收到的消息是:“异常(exception):找不到提供者。”
我不能说这是错误,但它有助于创建角度模块。
一个例子。
我已经(来自 Webstorm)使用 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';

尝试运行派生项目时出现以下错误:

(匿名函数)异常(exception):没有找到 TodoListService 的提供者。堆栈跟踪:
0 _EmptyInjector.get(包:angular2/src/core/di/injector.dart:54:7)
1 _MapInjector.get (package:angular2/src/core/di/injector.dart:73:52) 2 ReflectiveInjectorImpl._getByKeyDefault (package:angular2/src/core/di/reflective_injector.dart:816:18)
3 ReflectiveInjectorImpl._getByKey (package:angular2/src/core/di/reflective_injector.dart:782:14)
4 ReflectiveInjectorImpl.get (package:angular2/src/core/di/reflective_injector.dart:529:17)
5 AppView.injectorGet(包:angular2/src/core/linker/app_view.dart:236:37)
6 DebugAppView.injectorGet(包:angular2/src/debug/debug_app_view.dart:98:31)
7 ViewAppComponent0.build (package:angular_inject_subclass_derived/app_component.template.dart:90:71)
8 AppView.create(包:angular2/src/core/linker/app_view.dart:180:12)

有没有其他方法可以做到这一点?
是否可以在 Angular 中更改此行为,以便也可以注入(inject)提供者的子类而不是原始子类?

最佳答案

您可以使用提供子类

providers: const [
    materialProviders, 
    const Provider(base.TodoListService, useClass: TodoListService)
],

那么当某个类依赖于base.TodoListService , Angular 将注入(inject)子类 TodoListService这将与被调用的构造函数兼容,因为它是一个子类。
TodoListService单独是 const Provider(TodoListService, useClass: TodoListService) 的简短形式(可能会在 Angular 5 中停止使用)

关于dart - Angular2 Dart : Dividing a project in packages does not allow to reuse base components with modified providers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45934718/

相关文章:

dart - 保存和加载,共享首选项

namespaces - TCL 包和命名空间

dart - 无法加载angular.dart

dart - 如何运行angulardart应用程序?

scala - 如何将 Scala 中的包设为私有(private)?

dart - Shadow DOM "debug"适用于 Firefox,但缩小版本不适用于?

dart - 无法根据状态更改页面

Flutter 使用视频播放器或 ffmpeg 获取视频帧

dart - 异步 future 流订阅错误

.net - Visual Studio DTE2 : how to get text content of the current document