1

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

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

переопределить шаблонHelpers hash on querySuccess? – Evgeniy

+0

спасибо @Evgeniy, не могли бы вы привести мне пример? – cor

+0

Я мог бы заставить это работать, добавляя к успеху запроса эти две строки: 'this.templateHelpers();' 'that.render();' Вы имели в виду это? Я считаю это немного сложным решением. Во всяком случае, если вы дадите ему ответ, я отметю его;) – cor

ответ

2

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