我在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;
},
有什么想法吗?
答案 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
}