【问题标题】:How to use inject() in a Pipe with Angular 14?如何在 Angular 14 的管道中使用 inject()?
【发布时间】:2022-08-17 17:01:39
【问题描述】:

我正在尝试将服务离子注入管道。通常,inject(...) 工作正常,但在管道上下文中,我得到了错误:

Error: NG0203: inject() must be called from an injection context such as a constructor, a factory function, a field initializer, or a function used with `EnvironmentInjector#runInContext`

我做错了什么或者我怎样才能让它工作?

当我将依赖项放在构造函数中时服务工作正常,例如constructor(private service: CheckboxFilterPipe),但我现在想在组件代码中使用它(以编程方式使用transform()),在构造函数中写入依赖项是没有选择的了。

@Pipe({
    name: \'checkboxFilter\',
    pure: true,
})
export class CheckboxFilterPipe implements PipeTransform {
    /** */
    private service = inject(CheckboxFilterService);

    constructor() {}

    transform(items: Array<any>, filter: IFilterSettings, defaultFilter?: IFilterDefaults): any {
        this.service.init();
        return this.service.doFilter(items, filter, defaultFilter);
    }
}

谢谢您的帮助!

标签: angular angular-injector


【解决方案1】:

似乎只需在构造函数中导入就可以正常工作!

import { Component } from '@angular/core';
import { FilesizePipe } from './filesize.pipe';

interface File {
  name: string;
  size: any;
  type: string;
}

@Component({
  selector: 'app-root',
  template: `
    <!-- <div>
      <div *ngFor="let file of files">
        <p>{{ file.name }}</p>
        <p>{{ file.size | filesize }}</p>
        <p>{{ file.size | filesize:'megabytes' }}</p>      
      </div>
    </div>

    <div>
      <div *ngFor="let file of mapped">
        <p>{{ file.name }}</p>
        <p>{{ file.size }}</p>
      </div>
    </div> -->
    this is done programmatically. {{getTransformed()}}
  `,
  providers: [FilesizePipe],
})
export class AppComponent {
  files: File[];
  mapped: File[];
  constructor(private filesizePipe: FilesizePipe) {}
  ngOnInit() {
    this.files = [
      { name: 'logo.svg', size: 2120109, type: 'image/svg' },
      { name: 'banner.jpg', size: 18029, type: 'image/jpg' },
      { name: 'background.png', size: 1784562, type: 'image/png' },
    ];

    this.mapped = this.files.map((file) => {
      return {
        name: file.name,
        type: file.type,
        size: this.filesizePipe.transform(file.size, 'mb'),
      };
    });
  }

  getTransformed() {
    return this.filesizePipe.transform(96000, 'mb');
  }
}

stackblitz

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-09-20
    • 2016-08-17
    • 2022-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-22
    • 2017-03-13
    相关资源
    最近更新 更多