angular - 你如何在 Angular 中使用计算/计算的属性?

标签 angular binding calculated-field computed-properties computed-field

我被这个问题折磨着:我应该在 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/

相关文章:

Angular 2 : is there a way to know when a component is hidden?

asynchronous - Angular 2 - 使用异步 http 请求进行插值和绑定(bind)

java - 在 Java 中嵌入 Groovy(绑定(bind))

sql - 在 Access 中使用计算字段是否可以提高效率

python - EOL 在计算字段上停止 python

删除项目时的 JavaScript 计算

调用函数时,Angular img src 未知

arrays - 在新数组中创建和推送元素取决于条件

javascript - 在 Angular 2 的 ag-grid 中使用 gridOptions 中的变量

wpf - 简化非标准按钮的绑定(bind)