Javascript 击倒js-&&;处于if状态且无容器绑定

Javascript 击倒js-&&;处于if状态且无容器绑定,javascript,knockout.js,knockout-mvc,Javascript,Knockout.js,Knockout Mvc,我正在显示项目列表,如果项目不可用,我必须显示默认消息。现在,我必须检查对象是否已创建,然后检查对象是否包含列表 现在,我正在做下面的工作,它会创建不必要的dom元素。但是,当我对无容器绑定执行相同的操作时,它似乎不起作用,而且KO中是否有if的&&语法 <span data-bind="if: object"> <span data-bind="if: !object().property"> <p> The list is no

我正在显示项目列表,如果项目不可用,我必须显示默认消息。现在,我必须检查对象是否已创建,然后检查对象是否包含列表

现在,我正在做下面的工作,它会创建不必要的dom元素。但是,当我对无容器绑定执行相同的操作时,它似乎不起作用,而且KO中是否有if的&&语法

<span data-bind="if: object"> 
    <span data-bind="if: !object().property">
         <p> The list is not available </p>
    </span> 
</span> // Works 

<!-- ko if: object -->
     <!-- ko if: !object().property -->
          <p> The list is not available </p>
     <!-- /ko -->
<!-- /ko -->  // Doesn't work 

该列表不可用

//工作 该列表不可用

//不起作用

正如您所看到的,元素存在于DOM中,在ko.applyBindings调用完成之前,它不会被删除。因此,即时显示此消息

我会尝试隐藏DOM的整个部分,并显示一个加载指示器。当ko/ajax完成时,可以删除加载指示器,并显示您关心的标记


或者,您可以查看页面是否需要一段时间才能加载,并尝试缩短页面的加载时间。chrome分析工具可以帮助实现这一点。

正如CodeThug所提到的,使用您提供的解决方案将显示消息,直到ko.applyBindings完成。一个更详细的解决方案是使用动态模板,如下面的JSFIDLE所示,但在不依赖CSS的情况下可以避免问题:

这将仅在ko.applyBindings完成时在虚拟元素内创建有效标记

<!-- ko template: { name: dinamycList } -->
<!-- /ko -->

<script type="text/html" id="empty-template">
  ... list is NOT available markup ...
</script>

<script type="text/html" id="list-template">
  ... list is available markup ...
</script>

... 列表不可用。。。
... 列表是可用的标记。。。
dinamycList是一个函数,它根据有效列表的验证返回模板的名称

编辑:

通过阅读您的上一条评论,我想如果您想要的行为是仅在计算列表后显示“不可用模板”,并且属性为false,如果是这种情况,下面的fiddle将修复最后一条,以提供正确的条件

模板中的“如果”条件将处理淘汰准备就绪后,但在列表创建之前的时刻。如果条件变得太混乱,我建议将其放入ko.computed中,以获得清晰的标记

<!-- ko template: { name: dinamycList, if: object() !== undefined && object().property !== undefined } -->
<!-- /ko -->

使用我的约定而不是配置库,这非常简单

就这样,lib将为您创建模板

   this.items.subscribe(function(items) {
        if(items.length === 0) {
            this.items.push(new MyApp.EmptyViewModel());
        }
   }, this);

那么“对象”是一个函数?调用时返回对象的函数?如果不正确,则
object()。属性
不正确。两个版本的工作原理应该相同:。所以你在别的地方有你的问题。。。您应该尝试在JSFIDLE中重现您的问题……是的,我的问题是,当dom加载列表时,即使列表可用,也会立即显示“不可用”,因为对象是在最后计算出来的。也许您可以CSS
display:none使用
span
p
标记使其在初始加载时不可见,然后使用可见绑定?您应该能够使用
if:object&!object().property
,并删除其中一个span标记(除非它们是出于某种原因存在的)。对于解决方案,如果我没有错,它也会做同样的事情。。最初显示一个模板,然后它会更改。。。但我的问题是,该属性是一个数组,填充它几乎不需要时间。。当对象可用时,它会显示消息。如fiddle所示,此解决方案在创建对象之前不会显示任何内容,然后是“不可用标记”,直到对象的属性设置为true,然后是“可用标记”。我认为问题可能出在显示每个模板不是很清楚的情况下。您能否尝试澄清每个模板何时应该可见?如果ko/ajax完成,您如何传递值?因为对象存在,并且它需要一段时间来填充属性,该属性是一个数组。。。所以这就是为什么它会显示一段时间。。我想知道是否所有的操作都完成了,然后显示此消息..我有点困惑。。。你能告诉我们什么是物体和属性,这样我们就能更好地了解这些物体的样子了吗?嘿,这就是解释。。对象包含一个数组,数组项由ajax调用填充。。现在,当ajax调用返回项目时,显示项目列表,如果没有返回,则说“nothing returned”。。。。但由于加载ajax调用时DOM仍会显示“nothing returned”一段时间。。。如何使DOM等待ajax调用完成,然后显示。。