【发布时间】:2019-11-15 17:35:35
【问题描述】:
我在 foreach 的视图中嵌套了 if/else 绑定,大约需要一秒钟的时间来处理。它在创建 Dom 时阻止渲染。我计划在 JavaScript 中执行 if/else 条件并将整个 dom 元素发送到预先准备好的视图以加快速度。但是我是淘汰赛的新手,所以不确定这是否是一种有效的方法或者是否有更好的选择。下面的代码是有问题的代码,其中大部分数据被剥离以显示结构。在单个 a、li 等内部是对 DOM 元素的单个绑定。
<ul data-bind="foreach: categories; ">
<!-- ko if: $data.childCategories -->
<!-- ko ifnot: $data.id == 'example' -->
<!-- ko if: $data.id == 'another-example' -->
<li data-bind="attr: {'data-children': childCategories}">
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<!-- ko if: $data.childCategories -->
<a>
</a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a>
</a>
<!-- /ko -->
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<!-- ko if: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
<ul data-bind="foreach: childCategories ">
<li>
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<a></a>
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<!-- ko if: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
<!-- ko if: $data.childCategories -->
<div>
<div>
<div>
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<a></a>
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<!-- ko if: $data.longDescription.indexOf('http') >= 0 -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.longDescription.indexOf('http') >= 0 -->
<a></a>
<!-- /ko -->
<!-- /ko -->
</div>
<ul data-bind="foreach: $data.childCategories">
<li></li>
</ul>
</div>
</div>
<!-- /ko -->
</li>
</ul>
</li>
<!-- /ko -->
<!-- ko ifnot: $data.id == 'another-example' -->
<li data-bind="attr: {'data-children': childCategories}">
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<!-- ko if: $data.childCategories -->
<a>
</a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a>
</a>
<!-- /ko -->
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<!-- ko if: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: $data.longDescription.indexOf('http') >= 0 -->
<!-- ko if: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<a></a>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
<!-- ko if: $data.childCategories -->
<div>
<div>
<div>
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<a></a>
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<!-- ko if: $data.longDescription.indexOf('http') >= 0 -->
<a></a>
<!-- /ko -->
<!-- ko ifnot: $data.longDescription.indexOf('http') >= 0 -->
<a></a>
<!-- /ko -->
<!-- /ko -->
</div>
<ul data-bind="foreach: $data.childCategories">
<li></li>
</ul>
</div>
</div>
<!-- /ko -->
</li>
<!-- /ko -->
<!-- /ko -->
<!-- /ko -->
<!-- ko ifnot: $data.childCategories -->
<!-- ko if: $data.id.indexOf('link-') < 0 -->
<li>
<a>
</a>
</li>
<!-- /ko -->
<!-- ko if: $data.id.indexOf('link-') >= 0 -->
<li></li>
<!-- /ko -->
<!-- /ko -->
【问题讨论】:
-
您当前的视图是什么样的?可能有更好的方法,但我们需要先看看你有什么。
-
我无法发布代码,但我可以更详细地了解它的构造方式。我们检索一个 JSON 对象,该对象包含其他对象的数组,这些对象又具有更多嵌套数组,深度为几层。这定义了产品目录类别的结构。现在构造的视图在顶层对象上有一个 foreach 和多个级别的 if/else 和数据绑定。渲染块,您可以看到多个布局/绘画正在发生。
-
如果这没有帮助,我可以在这里发布一个精简版来帮助说明问题。
-
我添加了结构的精简版。
标签: knockout.js