我被这个问题折磨着:我应该在 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。如果您搜索“Angular 计算属性”,您很可能会在组件本身中找到具有计算属性的示例。
@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
最佳答案
我将添加一个我觉得非常有用的模式。我个人喜欢保持关注点分离 - 即保留所有 Person
PersonService
中的相关计算属性并直接从服务中使用这些属性。特别是如果您在其他地方使用它们。
在您的 PersonService
我会添加一个 BehaviourSubject
您可以在其他地方的模板中绑定(bind)到:
// person.serice.ts
private readonly _fullName: BehaviorSubject<string> = new BehaviorSubject('');
public readonly fullName$ = this._fullName.asObservable();
public get fullName(): string {
return this._fullName.getValue();
}
public set fullName(p: Person): string {
this._fullName.next(p.firstName + p.lastName);
}
// inject http: HttpClient
get(id) {
return this.http.get<Person>(`api-endpoint/person/${id}`)
.pipe(tap((p: Person) => this.fullName = p);
}
在你的组件中:
// person.component.ts
@Component({
selector: 'app',
template: `
<div>
<input [value]='person.firstName'>
<input [value]='person.lastName'>
<span>{{ fullName$ | async }}</span>
</div>
`,
providers: [ PersonService ]
})
export class AppComponent {
person: Person;
fullName$: Observable<string>;
// inject personService: PersonService
ngOnInit() {
this.fullName$ = this.personService.fullName$;
this.personService.get(1).subscribe(p => this.person = p);
}
}
关于angular - 你如何在 Angular 中使用计算/计算的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56840705/