Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 具有异步数据的handlebar.js帮助程序_Javascript_Handlebars.js_Promise - Fatal编程技术网

Javascript 具有异步数据的handlebar.js帮助程序

Javascript 具有异步数据的handlebar.js帮助程序,javascript,handlebars.js,promise,Javascript,Handlebars.js,Promise,我想知道如何使用同步数据和把手助手。我想将cms消息加载到一个单页应用程序,我尝试了以下方法,但无法实现 请参阅下面的代码 function loadCmsMessage(key) { var cms = { "msg.001": "Hello {0} {1}" }; var deferred = $.Deferred(); setTimeout(function () { var

我想知道如何使用同步数据和把手助手。我想将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']
    }));
});
函数加载CMS消息(键){
变量cms={
“msg.001”:“你好{0}{1}”
};
var deferred=$.deferred();
setTimeout(函数(){
var msg=cms[key];
延迟。解决(msg);
}, 1000);
延迟返回。承诺();
}
车把.注册表帮助器('cms',功能(钥匙,arr){
var promise=loadCmsMessage(键);
承诺完成(功能(str){
str=把手.Utils.escapeeexpression(str);
如果($.isArray(arr)){
$。每个(arr,功能(i){
var safeStr=把手.Utils.escapeeexpression(arr[i]);
str=str.replace(“{”+i+“}”,safeStr);
});
}
var结果=''+str+'';
返回新把手。安全字符串(结果);
});
});
$(文档).ready(函数(){
var template=handlebar.compile($(“#myTemplate”).html();
$(“#wrap”).html(模板({
“人”:[‘简’、‘方达’]
}));
});

你不能。
return
语句是Promise的内部函数。Handlebar助手不允许异步。

Handlebar模板函数生成一个字符串,该字符串在javascript中是不可变的。当内容超出Handlebar的范围时,您应该调用ajax并重新生成模板。一些框架提供了这种功能的方法,比如余烬和angular,我相信我正在主干上使用木偶。