Saltar al contenido

cómo extender el servicio con dependencias en angular 2

Luego de mucho luchar pudimos dar con el resultado de esta cuestión que tantos usuarios de este sitio web presentan. Si tienes algo que aportar puedes aportar tu comentario.

Solución:

Los parámetros de la superclase deben repetirse y pasarse a la superllamada:

@Injectable()
export class ChildService extends ParentService
  constructor (http:Http, customService:CustomService)
    super(http, customService);
  

Hay algunos “trucos” para solucionar, como la herencia y la inyección de dependencia.

Simplemente haga el servicio base… no-@Injectable()! Por ejemplo, debe proporcionar un método para recuperar el perfil de usuario en LoginService. Este método será diferente para diferentes instancias de LoginService, y la clase principal no debe saber nada acerca de la procedencia de este método: puede ser lambda, puede ser una función exportada, puede ser un método de otro servicio. Para lograr esto, puede declarar el servicio principal cuyo servicio principal:

// Don't annotate it with @Injectable() ! It's a simple class.
export abstract class BaseLoginService {
  constructor(
    // This won't be injected automatically, 
    // child class must call super() and provide value for this argument.
    // Note: it's private, can't be accessed outside of BaseLoginService class
    private http: HttpClient,
    // Method used to retrieve user profile
    private profileGetter: () => Observable, 
    private router: Router
  ) 
    this.profileGetter().subscribe(); // Do something with this method
  

Luego extiéndalo en la clase infantil:

// Child class must be annotated with @Injectable(),
// if you don't need to extend it further
@Injectable() 
export class LoginService extends BaseLoginService {

  constructor(
    // Note: no public/private/protected here - "http"
    // will be just an argument
    http: HttpClient, 
    private profileService: ProfileService, // This is the private field of LoginService class
    router: Router,
    // Some service used by LoginService class, parent class BaseLoginService
    // doesn't need to know about SomeOtherService
    private someOtherService: SomeOtherService
  ) 
    super(
      http,
      // Need lambda here to capture profileService instance. If
      // profileService.getUserDetailsMethod doesn't use instance
      // fields or methods, then we can simply write 
      // "profileService.getUserDetailsMethod" (without quotes, obviously).
      () => profileService.getUserDetailsMethod(), 
      router
    );
    this.someOtherService.doSomething(); // Custom initialization code
  

Nota: en providers sección del módulo especificar LoginService en lugar de padre BaseLoginService:

providers: [
  LoginService,

y usarlo en clases de componentes:

export class LoginComponent implements OnInit {
  constructor(
    private loginService: LoginService
  ) 
  

Si necesita usar el servicio principal (por ejemplo, en componentes compartidos que solo necesitan funcionalidad de la clase de servicio principal), proporcione BaseLoginService Por aquí:

providers: [
  provide: BaseLoginService, useExisting: LoginService, // For those components which need functionality from base class only
  LoginService, // Still need this one for those components which need functionality from child class

Comentarios y valoraciones del artículo

Si haces scroll puedes encontrar las aclaraciones de otros usuarios, tú además tienes el poder insertar el tuyo si te apetece.

¡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 *