Saltar al contenido

Angular: extender servicios y pasar parámetros

Te doy la bienvenida a nuestra página web, aquí vas a hallar la resolución que necesitas.

Solución:

Entonces, después de un buen trabajo de CH Buckingham, resolví que hacerlo de la manera “típica” es imposible.

Angular2 simplemente asume la función constructor () con el inyector. Sin embargo, lo que sí funciona es crear una función “init” alternativa a la que luego pueda pasar parámetros.

@Injectable()
export class ParentService 
  root:string = "This content comes from: ";
  myString:string = "The Parent";
  resultString:string;
  constructor()
    this.init();
  
  init() 
    this.resultString = this.root + this.myString;
  



@Injectable()
export class ChildService extends ParentService 
  constructor()
    super();
  
  init() 
    this.myString = "The Child";
    super.init();
  

De esta manera, puede establecer valores en el objeto secundario o pasarlos al padre.

Plunker de esto en acción

Aquí hay otra forma de extender un servicio en angular2 que funciona con la DI. El servicio secundario no puede utilizar el mismo nombre de parámetro para los servicios inyectables utilizados por el padre, de ahí el motivo de otro nombre de parámetro HTTP.

El servicio para padres:

@Injectable()
export class GenericStore 
   ....
   constructor(public config:GenericConfig,private http:Http) 
        ....
   
   ....

El servicio infantil:

const DEFAULT_CONFIG:GenericConfig =  ... ;
@Injectable()
export class ConfigStore extends GenericStore 
   ....
   constructor(private anotherHttp:Http) 
        super(DEFAULT_CONFIG,anotherHttp);
   
   ....

Actualización: si desea utilizar la interfaz de servicio estándar sin instanciación manual y pasar valores simples al constructor, entonces los documentos recomiendan configurar una fábrica, que requiere una cantidad casi tonta de código: Inyección de dependencia (desplácese hacia abajo hasta Proveedores de fábrica).

//this is all Google Example Code
constructor(private logger: Logger, private useCoolFeature: boolean) 
let heroServiceFactory = (logger: Logger, userService: UserService) => 
  return new HeroService(logger, userService.user.isSpecial);

let heroServiceDefinition = 
   useFactory: heroServiceFactory,
   deps: [Logger, UserService]
;
let heroServiceProvider = provide(HeroService, heroServiceDefinition);
bootstrap(AppComponent, [heroServiceProvider, Logger, UserService]);

Este código a continuación funciona correctamente, pero no usa el sistema del proveedor para los servicios:

//things.service.ts
@Injectable()
export class ThingService 
  public myString: string = "base";
  constructor(str: string) 
    this.myString = str;
  


@Injectable()
export class Thing2Service extends ThingService 
  constructor()
    super('I AM CHILD');
  


//app.component.ts
public thingService: ThingService = new ThingService("I AM PARENT");
public thing2Service: Thing2Service = new Thing2Service();

ThingService.myString === "I AM PARENT"; //true
Thing2Service.myString === "I AM CHILD"; //true

Puedes estimular nuestro cometido dejando un comentario o dejando una valoración te estamos eternamente agradecidos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *