如何检查是否存在可观察到的淘汰赛?

Arn*_*ati 1 javascript knockout.js

假设我有一个 json 的 observables :

self.name = ko.observable('Arnab');
self.surname= ko.observale('Bhagabati')

var person = {
  name:ko.observable('Arnab'),
  lastName= ko.observale('Bhagabati')
}
Run Code Online (Sandbox Code Playgroud)

console.log(person.name());

我可以通过“如何检查我是否person有一个名为“的淘汰可观察财产”来访问人名salary

if (typeof person.salary() !== 'undefined')
Run Code Online (Sandbox Code Playgroud)

给出params.salary is not a function

use*_*291 5

我如何检查我的人是否有一个名为工资的可观察财产?

(强调我的)

如果您按照 的方式使用检查if (ko.unwrap(person.salary)),就像其他答案所建议的那样,那么您基本上是在检查是否存在已定义的salary属性。

IE:

person = { salary: undefined };
person = { };
person = { salary: ko.observable() };
Run Code Online (Sandbox Code Playgroud)

都会true回归typeof ko.unwrap(person.salary) === "undefined"

如果我从字面上理解你写的内容,这并不能回答“person”对象是否有一个名为 的可观察属性salary

要回答这个问题,您需要ko.isObservable

person = { salary: undefined };
person = { };
person = { salary: ko.observable() };
Run Code Online (Sandbox Code Playgroud)
var persons = [
  [{ }, "{ }"],
  [{ salary: undefined }, "{ salary: undefined }" ],
  [{ salary: ko.observable() }, "{ salary: ko.observable()" ]
]

var check1 = person => typeof ko.unwrap(person.salary) === "undefined";
var check2 = person => ko.isObservable(person.salary);

console.log(check1.toString());
persons.forEach(([p, c]) => console.log(c, "->", check1(p)));

console.log(check2.toString());
persons.forEach(([p, c]) => console.log(c, "->", check2(p)));
Run Code Online (Sandbox Code Playgroud)

可能是我太字面地理解了你的问题,而你所需要的只是ko.unwrap,但我觉得我必须分享差异