假设我有一个服务,其中包含有关角度应用程序中已登录用户的信息。我有一个名为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;
}
这样,所有的东西都保持分离和可测试性。