如何在Angular2中提供一个不是来自主引导程序的实例?

时间:2016-01-22 18:16:33

标签: angular

我知道这个问题似乎微不足道,但事实并非如此。让我解释。 对于一个为其所有孩子提供instacne的组件,这很容易,你只需:

#!/bin/bash
seq=1
for f in $(ls -rt *jpg)
do
   # Generate new name with zero-padded sequence number
   new=$(printf "%04d_$f" $seq)
   echo Rename $f as $new
   # Remove "#" from start of following command if things look good so the renaming is actually done
   # mv "$f" $new"
   ((seq++))
done

但是,我正在尝试与我的Component的子项共享一个实例,我通过new手动实例化了它,如:

@Component({
   selector: 'Starwars',
   directives: [ShoppingComponent],
   template: `<shopping></shopping>`,
   providers: [CartActions]
})

也尝试了这些没有运气:

export class Starwars {
    private appStore:any;
    constructor() {
        this.appStore = new AppStore();

        // tried this with no luck
        var injector = Injector.resolveAndCreate([
            provide(AppStore, {useValue: this.appStore})
        ]);

        // tried this with no luck
        provide(AppStore, {useFactory: () => {
            return this.appStore;
        }})
    }
}

以及useClass ...正如我所说的那样,我正在尝试与我的组件的子项共享一个手动实例化的类,而不是我依赖注入的组件并且让Angular2为我实例化...

1 个答案:

答案 0 :(得分:1)

这是Angular 2中不可能的AFIK。

例如,有一些方法可以通过DynamicComponentLoader在运行时动态注入组件。但我们不能覆盖该组件的提供者,它们在组件元数据中,在运行时通过闭包进行保护,无法编辑。没有与依赖注入相关的生命周期钩子。

根本没有机制允许您尝试做什么, 实际上有一些机制可以避免它,就像提供者只读一样。没有允许在运行时从组件调用的提供程序类型。

看起来您尝试的是不可能的设计。这可能是一件好事,因为它避免了以意想不到的方式使用依赖注入机制。