You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular常量文件使用inject()调用服务报错问题求助

解决Angular常量文件中使用inject()注入服务报错的问题

你遇到的报错是因为**inject()只能在Angular的注入上下文内调用**——比如组件、服务、指令、管道的类中,或者依赖注入提供器的useFactory函数里。而你的常量文件是在模块加载阶段就执行初始化的,此时并不在注入上下文环境中,直接调用inject()必然抛出错误。

方案一:将列配置改为工厂函数,在组件中注入服务后生成配置

把原来的常量改成一个接收服务实例作为参数的工厂函数,在组件(或其他注入上下文环境)中注入服务后,调用这个函数生成列配置。

1. 修改列配置文件

import {GngColumn, GngDataType, GngEditorType, GngFormSimpleItem} from "gng-components";
import {DistributionAreaSalesRouteService} from './你的服务路径';

// 改为工厂函数,接收服务实例作为参数
export function createDistributionAreaSalesRouteColumns(service: DistributionAreaSalesRouteService): GngColumn[] {
  return [
    {
      dataField: 'salesRouteCode',
      dataType: GngDataType.String,
      alignment: 'right',
      allowSearch: true
    },
    {
      dataField: 'salesRouteName',
      dataType: GngDataType.String,
      alignment: 'right',
      allowEditing: true,
      allowSearch: true,
      formItem: {
        visibleIndex: 1,
        colSpan: 3,
        editorType: GngEditorType.SelectBox,
        editorOptions: {
          items: service.getList(),
          displayExpr: 'name'
        }
      } as GngFormSimpleItem,
    }
  ];
}

2. 在组件中使用

import { Component, inject } from '@angular/core';
import { createDistributionAreaSalesRouteColumns } from './你的列配置文件路径';
import { DistributionAreaSalesRouteService } from './你的服务路径';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponent {
  // 注入服务
  private salesRouteService = inject(DistributionAreaSalesRouteService);
  // 调用工厂函数生成列配置
  columns = createDistributionAreaSalesRouteColumns(this.salesRouteService);
}

方案二:处理异步数据场景(如果getList()是HTTP请求等异步操作)

如果getList()返回的是Observable(比如从后端接口获取数据),需要处理异步加载的情况:

组件中订阅数据后赋值

import { Component, inject, OnInit } from '@angular/core';
import { createDistributionAreaSalesRouteColumns } from './你的列配置文件路径';
import { DistributionAreaSalesRouteService } from './你的服务路径';
import { GngColumn } from 'gng-components';

@Component({
  selector: 'app-your-component',
  templateUrl: './your-component.component.html'
})
export class YourComponent implements OnInit {
  private salesRouteService = inject(DistributionAreaSalesRouteService);
  columns: GngColumn[] = [];

  ngOnInit(): void {
    // 订阅服务的异步数据
    this.salesRouteService.getList().subscribe(items => {
      // 先生成基础列配置
      this.columns = createDistributionAreaSalesRouteColumns(this.salesRouteService);
      // 找到目标列,替换items数据
      const targetColumn = this.columns.find(col => col.dataField === 'salesRouteName');
      if (targetColumn?.formItem?.editorOptions) {
        targetColumn.formItem.editorOptions.items = items;
      }
    });
  }
}

(可选)如果组件支持直接绑定Observable

如果你的表格组件支持将items设为Observable类型,直接在工厂函数中传入service.getList()即可:

export function createDistributionAreaSalesRouteColumns(service: DistributionAreaSalesRouteService): GngColumn[] {
  return [
    // ...其他列
    {
      dataField: 'salesRouteName',
      // ...其他配置
      formItem: {
        // ...其他配置
        editorOptions: {
          items: service.getList(), // 直接传入Observable
          displayExpr: 'name'
        }
      } as GngFormSimpleItem,
    }
  ];
}

内容的提问来源于stack exchange,提问作者Sasan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 18:01:22