我在项目中为电影创建了一个模型类,其中包含以下内容
//movie/model.ts
export class Movie {
title:string;
overview:string;
id:string;
seasons:any[];
constructor(obj: any) {
this.id = obj.id;
this.overview = obj.overview;
this.title = obj.title;
}
}
此外,我已经提供了一项服务,使所有的http调用从api中获取数据。
//api.service.ts
import { Injectable } from '@angular/core';
import { Headers, Http } from '@angular/http';
import 'rxjs/Rx';
import {Movie} from './movie/model';
@Injectable()
export class ApiService {
constructor(private http: Http) {}
getMovie(id):{
let url = this.Api_Url + '/movies/' + id + "?extended=full,images";
return this.http.get(url, { headers: this.headers })
.map(d => d.json())
.map(d => new Movie(d))
.toPromise()
}
getActors(){...}
一切正常,我在我的bootstrap函数中提供了一个api服务实例,我可以在每个组件中使用它来获取电影。虽然我想在我的电影课中有这个api服务的实例,但我不知道如何告诉角度提供它。这就是我想要的,也是我所尝试过的。
//movie/model.ts
import {ApiService} from "../api.service";
export class Movie {
title:string;
overview:string;
id:string;
seasons:any[];
constructor(obj: any, private api: ApiService) {}
getActors(): {
this.api.getActors()
//api is null
}
}
我还尝试@Inject(api)
并使用new
创建它,但它说它依赖于http服务。那么,当这个类不是一个组件或服务而只是一个简单的es6类时,我怎么能告诉我在我的类上需要这个api实例呢?这是反模式吗?因为我曾经在角度1做同样的事情,一切都按预期工作。
答案 0 :(得分:2)
事实上,为了能够在Angular2的类中注入一些东西,你需要一个装饰器和一个相应的提供者注册。如果您自己实例化该类,则无法利用依赖注入。
话虽如此,您可以在实例化类时提供所需的依赖项:
@Injectable()
export class ApiService {
constructor(private http: Http) {}
getMovie(id):{
let url = this.Api_Url + '/movies/' + id + "?extended=full,images";
return this.http.get(url, { headers: this.headers })
.map(d => d.json())
.map(d => new Movie(d, this)) // <----
.toPromise()
}
getActors(){...}