【发布时间】:2019-11-12 09:46:43
【问题描述】:
我被这个问题折磨着:我应该在 Angular 项目中的哪里找到我的计算属性?
例如: 我有模型、获取模型的服务和展示模型的组件。
person.model.ts:
export class Person {
firstName: string;
lastName: string;
}
person.service.ts:
export class PersonService {
// inject http: HttpClient
get(id) {
return this.http.get<Person>(`api-endpoint/person/${id}`);
}
}
person.component.ts
@Component({
selector: 'app',
template: `
<div>
<input [value]='person.firstName'>
<input [value]='person.lastName'>
</div>
`,
providers: [ PersonService ]
})
export class AppComponent {
person: Person;
// inject personService: PersonService
ngOnInit() {
personService.get(1).subscribe(p => this.person = p);
}
}
现在我需要fullName 将其显示到我的输入字段下的模板中。
选项 1。如果您在 google 上搜索“角度计算属性”,您很可能会在组件本身中找到具有计算属性的示例。
@Component({
selector: 'app',
template: `
<div>
<input [value]='person.firstName'>
<input [value]='person.lastName'>
<span>{{ fullName }}</span>
</div>
`,
providers: [ PersonService ]
})
export class AppComponent {
person: Person;
get fullName() {
return `${this.person.firstName} ${this.person.lastName}`
}
// inject personService: PersonService
ngOnInit() {
personService.get(1).subscribe(p => this.person = p);
}
}
但是,这是否是此类代码的正确位置? 如果我们想在其他组件、服务等中重用这个属性怎么办?
选项2。我个人想扩展person.model.ts。
export class Person {
firstName: string;
lastName: string;
get fullName(): string {
return `${this.firstName} ${this.lastName}`
}
}
@Component({
selector: 'app',
template: `
<div>
<input [value]='person.firstName'>
<input [value]='person.lastName'>
<span>{{ person.fullName }}</span>
</div>
`,
providers: [ PersonService ]
})
export class AppComponent {
person: Person;
// inject personService: PersonService
ngOnInit() {
personService.get(1).subscribe(p => this.person = p);
}
}
但是我们面临另一个问题。我们的 personService 返回的对象根本没有这个 getter。
那我该怎么办?我是否需要创建person.model.ts 的新实例,然后将我们的响应分配给它,或者我可能需要另一个模型,比如person.view-model.ts?
感谢您的宝贵时间:D
【问题讨论】:
-
我会选择选项 2,我会将 personService 理解为实体存储库,不确定您所说的“我们的 personService 完全返回没有这个 getter 的对象”是什么意思。能详细点吗?
-
@Xesenix 看看我的小例子stackblitz.com/edit/angular-cwgqhu。问题也在这里解释:stackoverflow.com/questions/49516876/…
-
是的,您没有创建该模型的实际对象,您只是告诉 typescript 假设它应该是您需要使用服务器返回的数据初始化 Person 模型的那种返回值,因此它需要拥有可以将服务器响应转换为其字段的构造函数
-
@Xesenix 好的。那么你怎么能选择选项2呢? (你在第一条评论中写道)
-
我已经添加了草稿,您如何处理它,但它可能需要一些边缘案例修改,并且实际上并没有运行代码,因此可能需要一些修复
标签: angular binding calculated-field computed-properties computed-field