Залить Http вручную в угловой 2
Я создал базовую модель, в которой у меня есть все общие функции для извлечения данных и публикации или размещения данных. На самом деле, что сервис делает в угловых, но я не хочу сервис. Нет, то, что я планирую сделать, - это то, что базовая модель будет расширена всеми модулями в моей системе, причем каждый модуль имеет свою базовую конечную точку для получения данных из API. Теперь вот проблема. Если я внедряю службу Http в базовую модель, а пользовательская модель расширяет базовую модель, то теперь, чтобы создать объект базовой модели, мне нужно передать объект Http, который я не могу.
Пожалуйста, дайте мне знать, если вам нужна дополнительная поддержка, чтобы ответить на этот вопрос.
export class BaseModel {
constructor (http: Http) {}
fetch() {
let params = {
"includes": this.includes,
"page": page,
"filters" : this.filters,
"order" : this.orderDirection + this.orderColumn
};
return this.api.get("/"+this.endpoint, params)
.map(
(response: any) => {
let total = response.meta.total;
let current = response.meta.current;
let min = current - 5;
let max = current + 5;
if (min < 1) {
min = 1;
}
if (max > total) {
max = total;
}
else if (max < 10) {
if(total < 10) {
max = total;
}else {
max = 10;
}
}
let pages : number[] = [];
for (let i = min; i <= max; i++) {
pages.push(i);
}
this.pages = pages;
return response
}
);
}
}
Теперь моя модель пользователя
export class User extends BaseModel {
public id : number;
public username : string;
public email : string;
public password : string;
public passwordConfirmation : string;
public details : UserDetail = new UserDetail();
public type : string;
public status : string;
public profileImage : string;
public profileImageUrl : string;
public crop : Object = {};
public lastLogin : string;
public numberOfLogin : string;
public joinDate : string;
public registerType : string = "web";
public static create(response : any) {
if (response === undefined || response === null) {
return response;
}
let details = new UserDetail();
if (response.details) {
details = UserDetail.create(response.details);
}
let user = new User(); //error parameter required
user.id = response.id;
user.username = response.username;
user.email = response.email;
user.status = response.status;
user.type = response.type;
user.details.id = response.details.id;
user.details = details;
user.profileImageUrl = response.profile_image_url;
user.joinDate = response.created_at;
user.registerType = response.register_type;
return user;
}
}
2 ответа
ОБНОВЛЕНИЕ (окончательное)
constructor() {
let injector = ReflectiveInjector.resolveAndCreate([
Http,
BrowserXhr,
{provide: RequestOptions, useClass: BaseRequestOptions},
{provide: ResponseOptions, useClass: BaseResponseOptions},
{provide: ConnectionBackend, useClass: XHRBackend},
{provide: XSRFStrategy, useFactory: () => new CookieXSRFStrategy()},
]);
this.http = injector.get(Http);
}
ОРИГИНАЛ (RC.x)
constructor() {
let injector = ReflectiveInjector.resolveAndCreate([HTTP_PROVIDERS]);
this.http = injector.get(Http);
}
Это создаст новый инжектор (независимо от того, который используется остальной частью вашего приложения Angular2. Это не обязательно проблема, вы просто должны знать об этом.
См. Также angular2 resolAndCreate HTTP - отсутствует HTTP_PROVIDERS в RC7
Гадкое решение, которое работает в Angular 2.1
import {ReflectiveInjector} from '@angular/core';
import {Http, HttpModule} from "@angular/http";
const providers = (<any>HttpModule).decorators[0].args[0].providers;
const injector = ReflectiveInjector.resolveAndCreate(providers);
const http = injector.get(Http);