为了账号安全,请及时绑定邮箱和手机立即绑定

在 ng build --prod 期间无法解析验证指令中的所有参数

在 ng build --prod 期间无法解析验证指令中的所有参数

慕田峪4524236 2021-07-13 13:01:14
我做了一个自定义验证指令来验证唯一的永久链接。这段代码工作正常,但是当我尝试为生产创建构建时,它给了我以下错误:-错误:无法解析 E:/Manish/Projects/ampleAdmin/src/app/shared/permalink-validation.directive.ts: ([object Object], ?) 中 UniquePermalinkValidatorDirective 的所有参数。永久链接-validation.directive.tsimport { Directive } from '@angular/core';import { AsyncValidator, AbstractControl, ValidationErrors, NG_ASYNC_VALIDATORS, AsyncValidatorFn } from '@angular/forms';import { Observable, of } from 'rxjs';import { map } from 'rxjs/operators';import * as qs from 'qs';import { PageService } from '../services/page.service';import { IPage } from '../client-schema';export function UniquePermalinkValidator(pageService: PageService, page: IPage): AsyncValidatorFn {  return (ctrl: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> => {    if (!(ctrl && ctrl.value)) { return null; }    const cond: any = {      where: {        permalink: ctrl.value      }    };    if (page && page.id) {      cond.where.id = { nin: [page.id]};    }    const query = qs.stringify(cond, { addQueryPrefix: true });    return pageService.getPageCount(query).pipe(      map(res => {        return res && res.count ? { uniquePermalink: true } : null;      })    );  };}@Directive({  selector: '[appUniquePermalink]',  providers: [{ provide: NG_ASYNC_VALIDATORS, useExisting: UniquePermalinkValidatorDirective, multi: true }]})export class UniquePermalinkValidatorDirective implements AsyncValidator {  constructor(private pageService: PageService, private page: IPage) { }  validate(ctrl: AbstractControl): Promise<ValidationErrors | null> | Observable<ValidationErrors | null> {    return UniquePermalinkValidator(this.pageService, this.page)(ctrl);  }}
查看完整描述

1 回答

?
墨色风雨

TA贡献1853条经验 获得超6个赞

给定的


export function UniquePermalinkValidator(pageService: PageService, page: IPage): AsyncValidatorFn {

  // ...

}

并给予


@Directive({

  selector: '[appUniquePermalink]',

  providers: [{ provide: NG_ASYNC_VALIDATORS, useExisting: UniquePermalinkValidatorDirective, multi: true }]

})

export class UniquePermalinkValidatorDirective implements AsyncValidator {    

  constructor(private pageService: PageService, private page: IPage) {}

  // ...

}

鉴于它仅由以下IPage定义


export interface IPage {

  id: number;

  // ...

}

然后UniquePermalinkValidatorDirective根据定义将无法工作,以描述的方式失败。


Aninterface只在类型空间中定义了一些东西,而不是在值空间中,因此没有任何运行时表现形式。这意味着它不能用于值位置。


本质上,Angular 的依赖注入系统读取构造函数参数的类型,当值空间中有对应命名的声明时,它会使用对应命名的值作为注入标记。


例如,以下


import {Injectable} from '@angular/core';


@Injectable() export class Service {

    constructor(http: Http) {}

}

也可以写


import {Inject} from '@angular/core';


export class Service {

    constructor(@Inject(Http) http: ThisTypeIsArbitraryWithRespectToInjection) {}

}

这意味着同样的事情


请注意如何Http作为参数传递给Inject. 但是Inject(IPage), where IPageis an interface, 格式错误。


的主要目的@Inject(ProviderToken)是允许在像您这样的情况下将提供者与装饰参数的类型正交地注入。


因此,您需要类似的东西


constructor(@Inject(pageToken) page) {}

这意味着需要定义一个令牌并使用它来注册一个可以注入的提供者。


一个人可以而且应该仍然写


constructor(@Inject(pageToken) page: IPage) {}

为了给参数一个类型,但类型与为参数注入的值无关。


例如


import {InjectionToken, NgModule} from '@angular/core';


export const pageToken = new InjectionToken<IPage>('Page');


@NgModule({

  providers: [

    {

      provide: pageToken,

      useFactory: functionReturningAPage

    }

  ]

 }) export class // ...


查看完整回答
反对 回复 2021-07-15
  • 1 回答
  • 0 关注
  • 165 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信