Сделать templateHelpers ждать, пока функция асинхронизации закончится в Marionette

57
5

Я использую плагин Storage of phonegap в Marionette ItemView, но может быть любым асинхронным материалом. Я просто хочу передать переменную throw помощник шаблона, который должен дождаться (в данном случае) операций БД.

Я также попытался поместить асинхронный кусок кода внутри функции 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;
},

Есть идеи?

спросил(а) 2014-10-23T15:22:00+04:00 5 лет, 11 месяцев назад
1
Решение
70

Как обсуждалось в комментариях, решение заключается в повторной визуализации представления после завершения загрузки async. Это работает, потому что метод 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
}

ответил(а) 2014-10-24T17:57:00+04:00 5 лет, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема