假设我有一个服务,其中包含有关角度应用程序中已登录用户的信息。我有一个名为Sell的模型,其中包含一个字段,该字段是实例化某些id对象的用户Sell。在调用构造函数时,sell会自动获取用户id并将其分配给object,是否有方法在模型中注入用户服务(我不知道这里的“inject”是不是最好的词)?
例子:
用户.service.ts

...
@Injectable()
export class UserService {
  private _id: string = 'some_id';

  get id(): string {
    return this._id;
  }
}

sell.model.ts公司
export class Sell {
  userId: string;
  price: number;
  ...

  constructor() {
    // some way to have userService here
    this.userId = this.userService.id;
  }
}

一些组件
import { Component } from '@angular/core';
import { Sell } from '../models/sell.model';

@Component({
  ...
})
export class SomeComponent {

  newSell() {
    let sell = new Sell();
    // with this line, I'd want that the model itself assign user id
    // to its object.
    console.log(sell.userId) // some_id
  }
}

最佳答案

你试图做的是合理的,你试图做的方式被认为是一个坏的做法(大火焰战争在过去的一天,所以不会进入)
最好的方法之一就是使用工厂来构造对象。
所以你的代码看起来像:

// Component needing model
@Component(...)
class SomeComponent {
    constructor(sellFactory: SellFactoryService){
        const sell = sellFactory.getNewSell();
        console.log(sell.userId)

}

/// Sell factory
@Injectable()
class SellFactoryService {
    constructor(private _userService: UserService){
    }

    getNewSell(){
       const sell = new Sell();
       sell.userId = this._userService.id;
       return sell;
    }
}

// Your sell class remains dumb (btw Sale would be a much better name for a model)
export class Sell {
  userId: string;
  price: number;
}

这样,所有的东西都保持分离和可测试性。

07-26 04:46