如何通过DynamicComponentLoader向@Component提供数据?

时间:2015-10-21 21:07:26

标签: angular

我需要通过DynamicComponentLoader通过var bindings = Injector.resolve([bind(Model).toValue(viewModel)]); this.loader.loadIntoLocation(component, eleRef, anchor, bindings) 向组件提供视图数据,但是为此我需要绑定数据。

this.loader.loadIntoLocation(component, eleRef, anchor).then(componentRef=> {
  var comp:AbstractComponentBase = componentRef.instance;
  comp.model = viewModel;
});

这可行,但我需要将数据绑定到注入系统,因此我不确定这是否是正确的方法。

设置数据的另一种方法是使用promise:

null

这也可以,但在初始化期间模型为@ViewChildren(或伪值),这可能是afterViewInit()DynamicComponentLoader的问题。

是否有另一种方法可以为使用{{1}}创建的组件提供数据?

1 个答案:

答案 0 :(得分:1)

我正在尝试一个页面容器组件,它需要响应路由更改以支持多文档界面之类的功能。我的所有路由都映射到此公共容器组件,并且使用RouteData定义页面的标识。我还有一个公共页面组件(用于支持来自我转换的应用程序的基于jquery的页面),这些页面将动态创建并且RouteData正在其构造函数中注入。

当我意识到在第一页加载后,后续路由更改没有导致相应的RouteData在公共页面组件的新实例中可用时,我遇到了类似的需求。在每次路径更改时,新页面实例将看到与第一页对应的路径数据值,而不是当前页面。

为了解决这个问题,我明确地更改了可用于动态创建页面的RouteData提供程序,如下所示:

var providers = Injector.resolve([new Provider(RouteData, { useValue: next.routeData })]);
this.loader.loadIntoLocation(LegacyPanelComponent, this.element, 'panels', providers)
    .then(componentRef => this.setActiveRoute(nextRoute, componentRef));

我认为您可以使用类似的方法将数据传递到动态组件,并将自定义类实例作为提供程序提供。