检索可观察值的当前值

时间:2019-05-27 14:21:25

标签: typescript knockout.js

如果我想获得一个可观察值,我通常将其称为函数。

说,我有一个具有以下可观察对象的模型

export interface ClientModel {
    name: KnockoutObservable<string>;
    age: KnockoutObservable<number>;
}

还有一个如下所示不可观察的模型

export interface ServerModel {
   name: string;
   age: number;
}

下面是从一种模型转换为另一种模型的两种实现。

A

export function getServerModelJson(person: ClientModel) : ServerModel {
   const personJson: ServerModel = {
      name: ko.unwrap(person.name),
      age: ko.unwrap(person.age)       
   }
   return personJson;
}

B

export function getServerModelJson(person: ClientModel) : ServerModel {
   const personJson: ServerModel = {
      name: person.name(),
      age: perosn.age()       
   }
   return personJson;
}

两者之间是否有区别(将observable称为函数与使用ko.unwrap进行调用)。推荐的方法是什么?如果字段是复杂类型,将会发生什么变化。在这种情况下,如何进行转换?

1 个答案:

答案 0 :(得分:2)

  

两者之间有区别吗(将observable称为函数与使用ko.unwrap)。

两个:

  1. 如果直接将VM属性作为函数调用,则它必须是一个函数(例如,可观察的对象或其他)。如果这是一个简单的非功能数据属性,则会出现错误。使用ko.unwrap,在这种情况下,它可以为您提供简单的非功能数据属性的值(或者,当然是可观察值的值)。

  2. ko.unwrap添加了一个函数调用和一些检查(对ko.unwrap的调用以及它所做的工作来确定您通过的内容是否令人讨厌)。

如果您知道,这是可以观察到的,例如您的示例,则没有使用ko.unwap的真正理由。 (如果您知道,这是不可观察的,同样也没有使用ko.unwrap的真实理由。)

  

推荐的方法是什么?

取决于您的属性是什么,以及是否知道它们是可观察的,取决于您。

  

如果字段是复杂类型,将会发生什么变化。在这种情况下,如何进行转换?

什么也没有,您只是以相同的方式进行操作—请注意,如果复杂类型的属性也是可观察的,则必须分别处理它们(ko.unwrap并不深入)。