使用Handlebar.js辅助工具处理异步数据

4

我想知道如何处理同步数据和handlebar helpers。我想将cms消息加载到单页应用程序中,我尝试了以下方法,但未能实现。

请参见以下代码。

    function loadCmsMessage(key) {

    var cms = {
            "msg.001": "Hello {0} {1}"
        };

        var deferred = $.Deferred();
        setTimeout(function () {
            var msg = cms[key];
            deferred.resolve(msg);
        }, 1000);

        return deferred.promise();
    }

Handlebars.registerHelper('cms', function (key, arr) {

    var promise = loadCmsMessage(key);

    promise.done(function (str) {
        str = Handlebars.Utils.escapeExpression(str);

        if ($.isArray(arr)) {
            $.each(arr, function (i) {
                var safeStr = Handlebars.Utils.escapeExpression(arr[i]);
                str = str.replace("{" + i + "}", safeStr);
            });
        }

        var result = '<span class="cms-data">' + str + '</span>';

        return new Handlebars.SafeString(result);
    });

});

$(document).ready(function () {
    var template = Handlebars.compile($("#myTemplate").html());
    $("#wrap").html(template({
        "person": ['Jane', 'Fonda']
    }));
});

Handlebars模板函数在JavaScript中生成一个不可变的字符串。当内容超出Handlebars范围时,您应该进行ajax调用并重新生成模板。一些框架提供了这种功能,例如Ember和Angular。 - megawac
我正在使用Marionette在Backbone之上。 - fernando
1个回答

2
你无法这样做。 return 语句位于 Promise 的内部函数中。Handlebars 帮助器不允许异步操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接