javascript - Angular Filter + Typescript
Jag har ett mycket enkelt angularfilter.
Detta filter tar emot som indata en medlem av en uppräkning (kallad här XEnum) och returnerar strängen som representerar medlemmen i uppräkningen:
module Filters {
"use strict";
export function XEnumToStringFilter() {
return ( input: XEnum ) => {
return XEnum[input];
}
}
}
[...]
module Model {
export enum XEnum{
Started = 0,
Stopped = 1
}
}
[...]
app.filter( "xEnumToStringFilter", [Filters.XEnumToStringFilter] );
Det här fungerar mycket bra när jag använder xEnumToStringFilter i mina vyer :
{{0 | etatTransfertEnumToStringFilter}} skriv Startad
{{1 | etatTransfertEnumToStringFilter}} skriv ut Stoppad
Men jag vill använda detta filter i min tjänst:
app.service( "serviceUsingXEnum",
["xEnumToStringFilter",
Services.ServiceUsingXEnum] );
Men i min servicekonstruktör får jag bara ett konstigt fel:
module Services {
"use strict";
export class ServiceUsingXEnum {
constructor(
private xEnumToStringFilter: Filters.XEnumToStringFilter // error here
) {
// some beautiful code ...
}
}
}
Modul
Filtershar ingen exporterad medlemXEnumToStringFilter
Även när min autokomplettering säger att det finns!
Jag vill använda beroendeinjektion, jag skulle kunna bara göra Filters.XEnumToStringFilter()(somethingXEnum) men det är dåligt!
Varför kan jag inte använda XEnumToStringFilter som en typ?
Vad är ett bättre sätt att lösa det?
Svar #1
Det beror på att du använder funktionen som typdeklaration. Du kan antingen:
1) Ändra tjänstens konstruktördeklaration:
constructor(private xEnumToStringFilter: ( enum: XEnum ) => string )eller
2) Skapa ett gränssnitt och använd det gränssnittet där du vill använda filtret:
module Filters {
"use strict";
export interface IXEnumToStringFunction {
( input: XEnum ) => string
}
export function XEnumToStringFilter() {
return ( input: XEnum ) => {
return XEnum[input];
}
}
}
...
då i konstruktor
constructor(private xEnumToStringFilter: Filters.IXEnumToStringFunction )Svar #2
Det pågår två saker här som jag kommer försöka ta itu med separat.
1 - Ett filter är en funktion, inte en typ
Det närmaste du kan komma att skriva detta skulle vara:
private xEnumToStringFilter: () => string
2 - Felaktig användning av ett filter i service/controller
För att använda ett filter i en tjänst/controller måste du injicera $filter-tjänsten som du kan använda för att få en referens till ditt filter via det namn som det är registrerat under, se exemplet här
