javascript - knockout : Execute template in a newly appended DOM element

标签 javascript jquery knockout.js

我有一个大型数据对象,它生成一个包含许多长下拉菜单的表。这需要很长时间,所以我试图通过不在初始加载时渲染所有下拉菜单来加速表格的渲染。相反,我只想按需/点击渲染每个菜单。

// HTML Element
<button class="btn dropdown-toggle" data-toggle="dropdown" data-bind="click: getTags">Tag</button>
<ul class="dropdown-menu">
    // Some HTML here
</ul>

// KO Template
<script type="text/html" id="alltags">
    <a href="#" data-bind="text: $data"></a>
</script>

// JS Code
self.getTags = function(data, event) {
    self.availableTags(data.component.available_tags())
    $(event.target).parent().find('ul').prepend('<li data-bind="template: { name: alltags, data: availableTags }"></li>')
}

我遇到的问题是,DOM 元素按照我想要的方式添加到 div 前面,但在我的一生中,我无法让它执行 foreach: 循环并生成菜单内容。

我需要刷新绑定(bind)吗?

最佳答案

当您以这种方式添加 html 时,应用绑定(bind)将不会触发,我会做的是。

在加载时创建下拉菜单并将选项绑定(bind)到空数组,当单击事件触发时,用所需的数据填充空数组。

添加...

您可以创建一个模板来创建下拉列表并加载它们,然后执行类似的操作

<!--   ko foreach: templates -->

  <div data-bind:template:{name: tmpl, data:data}></div>
<!--     /ko  -->

然后使用 setTimeout 一次只加载几个,它仍然需要一段时间,但会减少你的 UI 陷入困境。

function recursive(){
setTimeout(function(){
  // load 5 templates into template array
  check if there are more left, call recursive function to add more
 },50);
}

有点复杂,但我过去也做过类似的事情来修复 UI 延迟

关于javascript - knockout : Execute template in a newly appended DOM element,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22593103/

相关文章:

Javascript/Jquery 从子文档中访问 iframe 中的元素属性

javascript - jQuery JavaScript 不适用于 Wordpress,对无冲突模式语法感到困惑

javascript - 通过 Knockout.js 在剑道网格中使用可编辑单元格

javascript - Atom Editor - 快速评论带有星号的 block ?

javascript - 检查MySQL数据是否已存在,如果不存在则INSERT。 [PHP+jQuery Ajax]

javascript - 如何在 nodejs 中创建双工流?

javascript - 在 Jquery 或 Jquery Mobile 中使用向左滑动来向左旋转图像

javascript - 处理 Ajax 中的错误返回未定义

javascript - 使用 KnockoutJS 计算的数组 - 抛出未定义的错误

ajax - 可以调用 ko.applyBindings 来绑定(bind)局部 View 吗?