我正在使用以下内容在typescript中创建用户模型:
import {Inject} from 'angular2/core';
import {Http} from "angular2/http";
export class User {
firstName:string;
lastName:string;
constructor(User:User, @Inject(Http) private _http){
this.firstName = User.firstName;
this.lastName = User.lastName;
}
getUserFirstName(){
return this.firstName;
}
addUser(){
return this._http.post('/api/user/',this);
}
}
在其他地方,我使用:
var use = new User(userObject) // where userObject is an object with firstName and lastName
这会创建对象,有两种方法:getUsername
和addUser
。
但是,注入http
会出现问题。它总是未定义的。你对这个问题有什么指针或解决方案吗?
由于
答案 0 :(得分:4)
如果要将参数注入类,则需要委托实例化到注入器。如果您自己使用new SomeClass()
创建实例,则不会进行注射。
如果您想要单个实例,只需将类型添加到提供程序并将其注入即可。
bootstrap(AppComponent, [OtherProviders, HTTP_PROVIDERS, User]);
export class MyComponent {
constructor(private user:User);
}
如果你想要多个实例(Angular DI默认创建单例并且总是返回相同的实例),你可以使用工厂。
@Injectable()
export class User {
firstName:string;
lastName:string;
constructor(User:User, @Inject(Http) private _http){
this.firstName = User.firstName;
this.lastName = User.lastName;
}
getUserFirstName(){
return this.firstName;
}
addUser(){
return this._http.post('/api/user/',this);
}
}
bootstrap(AppComponent, [OtherProviders, HTTP_PROVIDERS,
provide(User, {useFactory:
() => return (http) => new User(http);},
deps: [Http])]);
export class MyComponent {
consturctor(@Inject(User) private userFactory) {
user = this.userFactory();
}
}
答案 1 :(得分:1)
要使一个类可注射,你需要一个装饰器,@Injectable
一个。但在这种情况下,Angular2将通过它自己实例化该类,并在要使用它的类的构造函数中提供它。
如果要自己实例化类,则需要提供依赖项(在服务或组件中):
constructor(private http: Http) {
}
otherMethod() {
var use = new User(userObject, this.http);
}
您可以从@Inject
课程中移除此User
装饰器。