使templateHelpers等到异步函数在Marionette结束

时间:2014-10-23 12:22:27

标签: backbone.js underscore.js marionette data-synchronization

我在Marionette ItemView中使用了phonegap的Storage插件,但可能是任何异步内容。我只想传递一个变量抛出模板助手,它必须等到(在这种情况下)数据库操作结束。

我也尝试将异步代码放在templateHelpers函数中,但它不等待,value变量在模板中为空。

initialize: function(options){
    that=this;
    var db = window.openDatabase("MyDB", "1.0", "My Database", 200000);
    db.transaction(queryDB, errorCB);

    function queryDB(tx) {
        tx.executeSql('CREATE TABLE IF NOT EXISTS MyDB (id unique, name, value)');
        var query = "SELECT * FROM MyDB WHERE id="+that.model.get('id')+" LIMIT 1";
        tx.executeSql(query, [], querySuccess, errorCB);
    }

    function errorCB(err) {
        alert("Error processing SQL: "+err.code);
    }

    function querySuccess(tx, results) {
        var len = results.rows.length;
        if(len>0)
            that.value = results.rows.item(0).value;
    }                             

},

templateHelpers: function(){
    var helperParams = {};
    var val = {"value": this.value };
    _.extend(helperParams, val);
    return helperParams;
},

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

正如评论中所讨论的,解决方案是在异步加载完成后重新呈现视图。这是有效的,因为render视图中的Marionette方法会再次调用templateHelpers,具体而言不会再次调用initialize

function querySuccess(tx, results) {
    var len = results.rows.length;
    if(len>0)
        that.value = results.rows.item(0).value;
    that.render(); // <<< Re-render on success
}