2011-01-10 1 views
0

Вот кодWeb дб - получение данных обратно

onError = function(tx, e) { 
     alert('Something unexpected happened: ' + e.message); 
    } 

    var webdb = openDatabase(dbName, '1.0' , dbDesc , dbSize); 

    var colourArray = new Array(); 

    webdb.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM colours', 
         [], 
         function(tx,rs) { 
         var ctn = rs.rows.length; 
         for (var i=0; i < ctn; i++) { 
          var row = rs.rows.item(i);     
          colourArray.push([row.id , row.title]); 
         } 
         }, 
         onError); 
    }); 
    /** 
    * the array looks like [[1,'red'],[2,'white'],[3,'black'] ...] 
    */ 
    var ColourStore = new Ext.data.ArrayStore({fields: ['key', 'val'], 
               data: colourArray}); 

В таблице «цвет» содержит имя цвета и хэш-код. Предполагалось, что использование ExtJS Ext.data.ArrayStore будет использоваться для добавления других выпадающих списков в массивную форму.

Моя проблема - я не мог получить данные назад в виде массива. Переменная «colourArray» пуста ... Я знаю, что я ударил некоторую ошибку javascript, проблему с контуром ... но просто не мог понять, как вернуть это значение внутреннего цикла. Попробуйте много возврата -> возврат -> функция возврата и больше возврата. Ни один из них не работает.

+0

Просто найти нить http://stackoverflow.com/questions/1898178/callback-return-value-and-html5-executesql-function –

+0

[знак ...] только это одно делает весь HTML5 не готов к прайм-тайм ... действительно думаю о боли, просто чтобы получить переменную? –

+0

Только что протестировал клон activeRecord. тоже не работает. Потому что проблема у меня есть. У меня есть глобальное свойство (переменная). Мне нужно поставить результирующий набор в переменную (свойство), затем доступную для использования другими методами (функциями) позже. Когда вы пытаетесь console.log (variable) before - empty. After - undefined. В середине (в то время как все еще внутри оператора executeSql, вызываемого назад). Точно, что я хотел - заполнено данными. –

ответ

0

executeSQL является асинхронным. Вам нужно создать ColourStore в функции обратного вызова функции (tx, rs). Если вам нужны данные, доступные во всем мире, вы не сможете запустить приложение до тех пор, пока executeSQL не вызовет функцию обратного вызова. Пример:

Ext.onReady(function() { 
    var webdb = openDatabase(dbName, '1.0' , dbDesc , dbSize); 

    var colourArray = new Array(); 
    var ColourStore; 

    webdb.transaction(function(tx) { 
     tx.executeSql('SELECT * FROM colours', 
     [], function(tx,rs) { 
      var ctn = rs.rows.length; 
      for (var i=0; i < ctn; i++) { 
       var row = rs.rows.item(i); 
       colourArray.push([row.id , row.title]); 
      } 
      //INIT YOUR APP HERE IN ORDER TO HAVE ACCESS TO colourArray values 
      ColourStore = new Ext.... 
      YourApp.init(); 
     }, 
     onError); 
    }); 
}, this); 
+0

Хотелось бы, чтобы все было так просто. Всего всего 17 запросов ... Разделить логику так, как вы сказали, просто невозможно. Да, все в порядке. Если у меня есть только одно падение, но их более 17 ... на массивной форме 3 страницы. –

+0

ОК, я сделал еще один тест. В основном такой же, как и раньше. Но внутри цикла. Я просто jQuery.data(); –

+0

Ненавижу клавиатурный захват этой кровавой рамки комментариев !!! Вы можете нажать enter. Глупо. Anywa y, код внутри цикла. jQuery ('body'). data ({'returnData': rowData}); если вы попытаетесь вернуть его немедленно. Это не работает. но если вы присоедините его к кнопке или чему-то еще. нажмите и данные вернутся так, как вы хотите. Поэтому я уверен, что нахожусь здесь. Просто нужно выяснить, почему я не могу вернуть данные сразу после того, как данные были прикреплены jQuery. Любой гуру? –