【问题标题】:Creating models in typescript that take injectables在打字稿中创建可注射的模型
【发布时间】:2016-03-14 10:52:36
【问题描述】:

我正在 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 存在问题。它总是未定义的。您对这个问题有任何指示或解决方案吗?

谢谢

【问题讨论】:

    标签: typescript angular


    【解决方案1】:

    如果要将参数注入到类中,则需要将实例化委托给注入器。如果您使用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();
      }
    }
    

    【讨论】:

      【解决方案2】:

      要使注入类成为一个类,你需要一个装饰器,@Injectable。但在这种情况下,Angular2 将自己实例化该类,并在您要使用它的类的构造函数中提供它。

      如果你想自己实例化类,你需要提供依赖(在服务中或在组件中):

      constructor(private http: Http) {
      }
      
      otherMethod() {
        var use = new User(userObject, this.http);
      }
      

      在这种情况下,您可以从 User 类中删除 @Inject 装饰器。

      【讨论】:

      • 我正在考虑采用这种方式来做到这一点 - 但我认为这并不是真正“干净”的方式。不过谢谢!除非有人很快提出其他建议,否则我会将其标记为答案
      • 是的,我仍然认为这不是正确的做法。
      • 恕我直言,如果您想强制创建 (User) 实例,这种方法没有任何问题。
      • 同意。这种方法没有错。但这可能会更好,否则这种方法也没有问题..
      猜你喜欢
      • 1970-01-01
      • 2016-06-22
      • 2021-09-10
      • 2019-12-11
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 2022-01-06
      • 1970-01-01
      相关资源
      最近更新 更多