javascript - Handlebars.js:渲染大数据而不阻塞 UI – 使用 setTimeout() 延迟或延迟加载?

标签 javascript lazy-loading settimeout handlebars.js

我想使用 Handlebars 将大量数据加载到 HTML 表中,但网络浏览器往往会卡住。所以我正在寻找一种方法来防止用户界面阻塞。

按照我的方式修改 each 助手是行不通的,因为助手在生成 ret 完成之前就返回了:

JavaScript:

Handlebars.registerHelper('lazyeach', function(context, options) {
    var fn = options.fn;
    var i = 0, ret = "", data;

    if (Handlebars.Utils.isFunction(context)) { context = context.call(this); }

    if (options.data) {
        data = Handlebars.createFrame(options.data);
    }

    if(context && typeof context === 'object') {
        if (Handlebars.Utils.isArray(context)) {

            var loop = function() {

                for(var j = context.length; i<j; i++) {
                    if (data) {
                        data.index = i;
                        data.first = (i === 0);
                        data.last  = (i === (context.length-1));
                    }
                    ret = ret + fn(context[i], { data: data });

                    if (i % 100 == 0) {
                        i++;
                        setTimeout(loop, 5);
                        break;
                    }
                }
            }
            loop();
        }
    }
    return ret;
});

Handlebars 模板:

<table>
    <!-- … -->
    <tbody>
    {{#lazyeach data}}
        <tr>
            {{#data}}
                <td>{{data}}</td>
            {{/data}}
        </tr>
    {{/lazyeach}}
    </tbody>
</table>

您知道另一种方法吗?或者您可以帮助我让当前的方法发挥作用吗?

编辑: 我不坚持使用 Handlebars.js。因此,如果您知道可以实现上述目的的替代方案,请继续。

最佳答案

为什么不使用 js 已有的功能并实现混合解决方案?

<script>
var rowTemplateSource = $("#your-row-template").html();
var rowTemplate = Handlebars.compile(rowTemplateSource);

while(yourdata.length) {
    setTimeout(function(){
        rowTemplate(yourdata.splice(0,500)); //500 records per loop
    }, 500 /* 500ms between loops */);
}
</script>


<script id="your-row-template" type="text/x-handlebars-template">
<table>
<!-- … -->
<tbody>
{{#each data}}
    <tr>
        {{#data}}
            <td>{{data}}</td>
        {{/data}}
    </tr>
{{/each}}
</tbody>
</table>
</script>

我根本没有对此进行过测试,因此可能需要对循环等进行一些调整才能满足您的需求,但我相信它应该可以工作。

关于javascript - Handlebars.js:渲染大数据而不阻塞 UI – 使用 setTimeout() 延迟或延迟加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23290817/

相关文章:

javascript - 为什么要将对象中的所有值转换为 Javascript 中的字符串?

ios - 使用延迟加载在 ScrollView 上加载图像

javascript - 如何停止 setTimeout 循环?

javascript - 在 React 中使用数组设置状态

javascript - 动态 iframe 高度 - 似乎需要重新加载页面

wpf - 用不同的父节点和不同的子节点实现 WPF TreeView ?

javascript - 每 x 秒多个 XmlHttpRequest

jquery - 为什么 setTimeout() 为 0 毫秒。影响我的职能

javascript - focus() 在 IE 中不起作用

iphone - UITableView懒加载优化