0

我需要@Input()为我的ngComponentOutlet.

但似乎 Angular 没有这个功能。相反,我想在我的出口组件中传递的所有东西都应该通过Injector.

如果我想在可注射类中启动我想要提供的东西,那很好。但我需要更深入地研究并Observeble<number>在创建 Injector 步骤时提供某种可观察变量(例如类型)。但我无法在出口组件内获得可观察的变量。收到以下错误:NullInjectorError: No provider for [object Object]!

这是一个代码示例,我从 angular 文档 ( angular.io/api/common/NgComponentOutlet ) 中获得了这种模式并进行了一些修改:

@Injectable()
export class Greeter {
    suffix$: Observable<number> = null;
    constructor(private _suffix$: Observable<number>) {
        this.suffix$ = this._suffix$;
    }
}

@Component({
    selector: 'complete-component',
    template: `Complete: {{ greeter.suffix$ | async }}`
})
export class CompleteComponent {
    constructor(public greeter: Greeter) {
        this.greeter.suffix$.subscribe(data => console.log('data', data));
        // not working
    }
}

@Component({
    selector: 'ng-component-outlet-complete-example',
    template: `
        <ng-container *ngComponentOutlet="CompleteComponent; 
                                        injector: myInjector;"
    })
export class NgTemplateOutletCompleteExample {
    CompleteComponent = CompleteComponent;
    myInjector: Injector;

    suffix$: Observable<number> = of(3);

    constructor(injector: Injector) {
        this.myInjector =
            Injector.create({providers: [{provide: Greeter, deps: [this.suffix$]}], parent: injector});
    }
}

那么我怎样才能$suffix在出口组件中获取和订阅这个变量。

PS如果我提供NgTemplateOutletCompleteExampledeps阵列中并NgTemplateOutletCompleteExample.suffix$进入可注射组件Greeter- 它会起作用。但问题是我有很多NgTemplateOutletCompleteExample组件,这对我来说是无效的。

4

3 回答 3

0

对于采用输入和返回输出的组件的动态注入,我遇到了类似的问题。@Input()原生地,Angular 不支持@Output动态组件。

您可以使用包 NgDynamicComponent:https ://www.npmjs.com/package/ng-dynamic-component 。

NgComponentOutlet 语法支持

该包支持 NgComponentOutlet 语法,您可以在此处看到: https ://www.npmjs.com/package/ng-dynamic-component#ngcomponentoutlet-support

从我从您的代码中看到的,这就是您所要求的:NgComponentOutlet + Inputs 支持。

定制动态注射器,用于更高级的东西

您还可以创建自定义注入器:https ://www.npmjs.com/package/ng-dynamic-component#extra

于 2019-11-19T11:27:42.347 回答
0

最主要的是 Injector - 是一个静态注射器。因此,要在组件 oultet 中提供任何数据(或获取任何回调),我必须useValue使用deps.

构造函数NgTemplateOutletCompleteExample应该是这样的:

constructor(injector: Injector) {
    this.myInjector =
        Injector.create({providers: [{provide: Greeter, deps: [], useValue: {suffix$: this.suffix$}], parent: injector});
}
于 2019-11-19T12:23:39.930 回答
0

为了了解您收到该错误的原因,我建议您查看文档中的Dependency Providers

错误来自这里

Injector.create({providers: [{provide: Greeter, deps: [this.suffix$]}], parent: injector});

简而言之,deps数组必须是有效 DI 令牌的列表,并且没有为this.suffix$.

引用自来源(Angular 8.0.0)

export interface FactorySansProvider {
  /**
   * A function to invoke to create a value for this `token`. The function is invoked with
   * resolved values of `token`s in the `deps` field.
   */
  useFactory: Function;

  /**
   * A list of `token`s which need to be resolved by the injector. The list of values is then
   * used as arguments to the `useFactory` function.
   */
  deps?: any[];
}

这是解决它的一种方法:

const OBS_TOKEN = new InjectionToken('obs');

@Injectable()
export class Greeter {
  greeterProp = 'hello!';

   constructor (@Inject(OBS_TOKEN) public suffix$: Observable<any>) {
    console.log('[GREETER]', this.suffix$)
  }
}

@Component({ /* ... */ })
export class NgTemplateOutletCompleteExample {
 /* ... */

 myInjector = Injector.create({
    providers: [
      { provide: Greeter, deps: [OBS_TOKEN], },
      { provide: OBS_TOKEN, useValue: this.dummyObs$ },
    ],
    parent: this.inj,
  })

 /* ... */
}

StackBlitz

于 2019-11-20T18:29:46.727 回答