【问题标题】:How to check if a knockout observable exists?如何检查是否存在淘汰赛observable?
【发布时间】:2018-04-19 19:45:53
【问题描述】:

假设我有一个 json 的 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

【问题讨论】:

    标签: javascript knockout.js


    【解决方案1】:

    我如何检查我的人是否有一个被称为淘汰的可观察属性,比如薪水?

    (强调我的)

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

    即:

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

    将全部返回true for typeof ko.unwrap(person.salary) === "undefined"

    如果我从字面上理解你所写的内容,这并不能回答“人”对象是否具有名为 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>

    可能是我太从字面上理解了你的问题,你只需要ko.unwrap,但我觉得我必须分享不同之处

    【讨论】:

      【解决方案2】:

      observables 是函数。如果没有salary 属性,person.salary() 会抛出异常。

      所以你可以使用:

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

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

      更多信息请参考this question

      【讨论】:

        【解决方案3】:
        var val = ko.unwrap(person.salary);
        

        console.log(ko.unwrap(person.salary));
        

        无论person.salary 是否可观察都将起作用。

        【讨论】:

          【解决方案4】:

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

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

          【讨论】:

            【解决方案5】:

            如果您想要一个快速的解决方案,只需查看对象类型是否为函数,然后添加几个检查以检查其中是否存在敲除特定函数。这在 ko.computed 中使用起来很方便,当您非常确定 observable 将出现但尚未出现时。

            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

            【讨论】:

              猜你喜欢
              • 2013-04-10
              • 2019-07-05
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多