在Angular 4 Dart中获取ComponentFactory的最佳方法是什么?

时间:2017-10-26 14:43:37

标签: angular intellij-idea dart angular-dart

AngularDart Github仓库中有组件加载(https://github.com/dart-lang/angular/blob/master/doc/component_loading.md)的文档,它建议导入组件的模板文件(生成),然后访问该模板上的属性,您只需获取组件的名称并附加NgFactory对它。

import 'foo.template.dart' as ng;

void doSomething() {
  ng.FooComponentNgFactory;
  //             ^^^^^^^^^
}

但我的IDE(IntelliJ)无法看到foo.template.dart,因为它还没有生成并给我警告,然后它也对FooComponentNgFactory一无所知。由于Dart是动态的,这一切都在运行时运行,但它在我的IDE中留下了警告/错误,我不想养成不得不忽视的习惯,整个事情对我来说就像代码味道。

我还可以通过使用ComponentResolver获取工厂,而不需要使用生成的模板文件或NgFactory。我能看到的唯一缺点是它是async方法,在我看来这不是问题。

@Component(selector: 'some-component', template: '')
class SomeComponent {
  SomeComponent(this._resolver);

  ComponentResolver _resolver;

  Future doSomething() async {
    ComponentFactory factory = await _resolver.resolveComponent(FooComponent);
  }
}

在查看ComponentResolver的文档时,我认为没有任何理由不使用它(https://webdev.dartlang.org/api/angular/angular/ComponentResolver-class)。

为什么这不是获得ComponentFactory的可接受方式?我是否在使用NgFactory做错了什么,或者我需要小心使用我遗漏的ComponentResolver

1 个答案:

答案 0 :(得分:1)

我们不想使用解析器有两个原因:

  • 它需要组件类型和工厂之间的映射。 有了这张地图,Dart2JS不知道这个代码是否正在被使用 不能被树摇动。目前任何导入的组件都在我们的最后 可执行文件,即使我们不使用它们。
  • 我们可以通过不需要异步操作来加快速度。

树摇是最重要的原因。