Angular 5: решение неразрешенной зависимости в конструкторе - PullRequest
0 голосов
/ 27 апреля 2018

Я пытаюсь создать универсальный HttpService для моего проекта Angular 5.

Ошибка, которую я получаю:

Uncaught Ошибка: не удается разрешить все параметры для HttpService: ([объект объекта], [объект объекта], [объект объекта],?)

приложение / Util / constants.ts

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

@Injectable()
export class SERVER {
    readonly ROOT:string = 'http://localhost:8888/';
    readonly API_PATH:string = 'api/v1/';
}

@Injectable()
export class API_URLS {
    readonly USER:string = 'user/';
}

приложение / сериализаторов / serializer.ts

import { Resource } from 'app/models/resource';

export interface Serializer {
    fromJson(json: any): Resource;
    toJson(resource: Resource): any;
}

приложение / модели / resource.ts

export class Resource {
    id: number;        
}

приложение / модели / user.model.ts

import { Resource } from 'app/models/resource';

export class User extends Resource{
    id: number;
    name: string;
    email: string;
    gender: string;
    address: string;
    landmark: string;
    client_id: number;
    dealer_id: number;
    phone_number: string;
    alternate_phone_number: string;

    status: string;
    is_active: boolean;
    date_created: string;
    date_updated: string;
}

приложение / сериализаторов / user.serializer.ts

import { User } from 'app/models/user.model';
import { Serializer } from 'app/serializers/serializer';

export class UserSerializer implements Serializer {
    fromJson(json: any): User {
        const user = new User();

        user.id = json.id;
        user.client_id = json.client_id;
        user.dealer_id = json.dealer_id;

        user.status = json.status;
        user.is_active = json.is_active;
        user.date_created = json.date_created;
        user.date_updated = json.date_updated;

        return user;
    }

    toJson(user: User): any {
        return {
            id: user.id,
            client_id: user.client_id,
            dealer_id: user.dealer_id,

            status: user.status,
            is_active: user.is_active,
            date_created: user.date_created,
            date_updated: user.date_updated,
        };
    }
}

приложение / услуги / user.service.ts

import { Injectable } from '@angular/core';
import { SERVER } from 'app/util/constants';
import { API_URLS } from 'app/util/constants';
import { User }  from 'app/models/user.model';
import { HttpClient } from '@angular/common/http';
import { HttpService }  from 'app/services/http.service';
import { UserSerializer } from 'app/serializers/user.serializer';

@Injectable()
export class UserService extends HttpService<User> {
    constructor(
        server: SERVER,
        API_URLS: API_URLS,
        httpClient: HttpClient
    ) {
         super(
          server,
          httpClient,
          API_URLS.USER,
          new UserSerializer());
    }
}

приложение / app.module.ts

import { Observable } from 'rxjs/Rx';
import { NgModule } from '@angular/core';
import { AppComponent } from './app.component';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { BrowserModule } from '@angular/platform-browser';

/************** Services *****************/

import { UserService } from './services/user.service';

/************** Components *****************/

import { UserComponent } from './components/user/user.component';

/************** Constant *****************/

import { SERVER } from './util/constants';
import { API_URLS } from './util/constants';
import { OPERATION_TYPES } from './util/constants';
import { REQUEST_METHODS } from './util/constants';

import { Resource } from './models/resource';

@NgModule({
  declarations: [
    AppComponent,
    UserComponent,
  ],
  imports: [
    CommonModule,
    BrowserModule,
    AppRoutingModule,
    HttpClientModule
  ],
  providers: [
    SERVER,
    API_URLS,
    OPERATION_TYPES,
    REQUEST_METHODS,

    Resource,

    UserService,
  ],
  bootstrap: [AppComponent]
})
export class AppModule { }

Редактировать: добавлен отсутствующий код

приложение / услуги / http.service.ts

import { Observable } from 'rxjs/Rx';
import { Resource } from 'app/models/resource';
import { Serializer } from 'app/serializers/serializer';
import { SERVER } from 'app/util/constants';
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class HttpService<T extends Resource> {
constructor(
    private SERVER: SERVER,
    private httpClient: HttpClient,
    private API_URL: string,
    private serializer: Serializer) { }

/*
 *   Get single record by id
 */
read(id: number): Observable<T> {
    return this.httpClient.get<T>(`${this.SERVER.ROOT}/${this.SERVER.API_PATH}/${this.API_URL}/${id}`).map(data => this.serializer.fromJson(data) as T);
}

/*
 *   Get all records by page
 */
readRecords(): Observable<T[]>{
     return this.httpClient.get<T[]>(`${this.SERVER.ROOT}/${this.SERVER.API_PATH}/${this.API_URL}`).map((data: any) => this.convertData(data.items) as T[]);
}

/*
 *   Create new record
 */
create(record: T): Observable<T>{
    return this.httpClient.post<T>(`${this.SERVER.ROOT}/${this.SERVER.API_PATH}/${this.API_URL}`, record).map(data => this.serializer.fromJson(data) as T);
}

/*
 *   Update record
 */
update(record: T): Observable<T>{
    return this.httpClient.put<T>(`${this.SERVER.ROOT}/${this.SERVER.API_PATH}/${this.API_URL}/${record.id}`, record).map(data => this.serializer.fromJson(data) as T);
}

/*
 *   Remove record
 */
remove(id: number) {
    return this.httpClient.delete(`${this.SERVER.ROOT}/${this.SERVER.API_PATH}/${this.API_URL}/${id}`);
}

private convertData(data: any): T[] {
    return data.map(item => this.serializer.fromJson(item));
}
}

Что мне не хватает?

1 Ответ

0 голосов
/ 27 апреля 2018

Я решил эту проблему, создав абстрактный класс Serializer и сделав сериализаторы инъекционными.

import { Injectable } from '@angular/core';
import { Resource } from 'app/models/resource';

@Injectable()
export abstract class Serializer {
    abstract fromJson(json: any): Resource;
    abstract toJson(resource: Resource): any;
}

И

import { Injectable } from '@angular/core';
import { User } from 'app/models/user.model';
import { Serializer } from 'app/serializers/serializer';

@Injectable()    
export class UserSerializer implements Serializer {
    fromJson(json: any): User {
        const user = new User();

        user.id = json.id;
        user.client_id = json.client_id;
        user.dealer_id = json.dealer_id;

        user.status = json.status;
        user.is_active = json.is_active;
        user.date_created = json.date_created;
        user.date_updated = json.date_updated;

        return user;
    }

    toJson(user: User): any {
        return {
            id: user.id,
            client_id: user.client_id,
            dealer_id: user.dealer_id,

            status: user.status,
            is_active: user.is_active,
            date_created: user.date_created,
            date_updated: user.date_updated,
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...