Javascript 敲除JS:检查IF绑定中是否存在可观察对象

Javascript 敲除JS:检查IF绑定中是否存在可观察对象,javascript,knockout.js,Javascript,Knockout.js,我正在为几个稍微不同的对象呈现一个类似的HTML块。它们90%是相同的,但每一个都有一些特殊的怪癖,需要额外的观察。我想在一个模板块中呈现这些几乎相似的项中的每一个,但是我遇到了未定义对象的问题 基本上,我想在模板中呈现一个可观察对象之前检查它是否存在 我正在尝试这样做: <div data-bind="foreach: blocks"> <h2 data-bind="text: normalHeader"><h2> <p data-bind="text

我正在为几个稍微不同的对象呈现一个类似的HTML块。它们90%是相同的,但每一个都有一些特殊的怪癖,需要额外的观察。我想在一个模板块中呈现这些几乎相似的项中的每一个,但是我遇到了未定义对象的问题

基本上,我想在模板中呈现一个可观察对象之前检查它是否存在

我正在尝试这样做:

<div data-bind="foreach: blocks">
<h2 data-bind="text: normalHeader"><h2>
<p data-bind="text: normalText"></p>
<!-- ko if: specialText --><p data-bind="text: specialText"></p><!-- /ko -->
</div>
从我对Knockout的“if”绑定的理解来看,如果对象返回任何类型的false-like值,比如null或undefined,那么它应该可以工作,这意味着if绑定应该正常地失败,而它肯定不会失败

有什么办法可以让这一切顺利进行吗?

试试这个:

<!-- ko if: specialText != null -->


ko会将它识别为一个表达式而不是一个值,因此它应该按照您的意愿工作:)

您可以使用以下方法:

<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: $data.hasOwnProperty("Bar") -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->​



我发布了一个

基于Oybek的解决方案,您还可以:

<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: "Bar" in $data -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->​



例如:

您可以通过对象的索引器访问:





这也可以,但是hasOwnProperty函数更干净一些;谢谢此解决方案处理多态对象,而如果将要查找的属性添加到原型中,则hasOwnProperty()将失败。在为每个属性执行一次检查时,最好使用hasOwnProperty()排除原型属性,但在这个用例中,我认为直接检查“未定义”是最好的。然而,如果属性出现,它当然不会改变,因为它不可观察,它不会做人们通常想做的事情,“当然”?好的
<!-- ko foreach: Items -->
    <strong data-bind="text: Foo"></strong>
    <br />
    <!-- ko if: "Bar" in $data -->
        <p data-bind="text: Bar"></p>
    <!-- /ko -->
<!-- /ko -->​