在打印注射器的打字稿中创建模型

时间:2016-03-14 10:52:37

标签: typescript angular

我正在使用以下内容在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

这会创建对象,有两种方法:getUsernameaddUser

但是,注入http会出现问题。它总是未定义的。你对这个问题有什么指针或解决方案吗?

由于

2 个答案:

答案 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装饰器。