如何检查是否存在淘汰观察?

时间:2017-11-07 11:57:31

标签: javascript knockout.js

说我有一个jserv of observables:

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

var person = {
  name:ko.observable('Arnab'),
  lastName= ko.observale('Bhagabati')
}

我可以通过console.log(person.name());访问此人的姓名

如何检查我的person是否有被淘汰的可观察属性,例如salary

if (typeof person.salary() !== 'undefined')

给出params.salary is not a function

5 个答案:

答案 0 :(得分:2)

可观察性是功能。如果没有salary属性,person.salary()将抛出异常。

所以你可以使用:

if (typeof ko.unwrap(person.salary) !== 'undefined')
{

}

unwrap返回属性的值,无论它是否可观察。

有关更多信息,请参阅this question

答案 1 :(得分:2)

  

我如何检查我的人是否有被淘汰的可观察财产,比如工资?

(强调我的)

如果您使用与if (ko.unwrap(person.salary))一致的检查,与其他答案一样,您基本上会检查是否有定义的salary属性。

即:

person = { salary: undefined };
person = { };
person = { salary: ko.observable() };

对于true

,所有人都会返回typeof ko.unwrap(person.salary) === "undefined"

如果我从字面上理解你所写的内容,这并不能回答“#39; object有一个名为salary的可观察属性。

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



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)));

<script src="https://cdnjs.cloudflare.com/ajax/libs/knockout/3.4.2/knockout-min.js"></script>
&#13;
&#13;
&#13;

可能是我的问题太过于字面意思了,你所需要的只是ko.unwrap,但我觉得我必须分享差异

答案 2 :(得分:0)

在以下代码中,!=会同时检查nullundefined

if (person.salary != null) {
    // ...
}

答案 3 :(得分:0)

var val = ko.unwrap(person.salary);

console.log(ko.unwrap(person.salary));
无论person.salary是否可观察,

都会有效。

答案 4 :(得分:0)

如果需要快速解决方案,只需查看对象类型是否为函数,然后添加一些检查以检查其中是否存在剔除特定函数。当您非常确定可观察对象即将出现但还没有出现时,在ko.computed中使用此方法很方便。

var isKoObservable = function(obs) {
  var retVal = false;
  if (typeof obs === "function") {
    if (typeof obs.subscribe === "function" && typeof obs.notifySubscribers === "function") {
      // its HIGHLY likely to be an observable or observableArray
      retVal = true; 
    }
  }

  return retVal;
}

有关详细信息,请参见此SO答案: how to tell if a javascript variable is a function