0
$("#username").autocomplete({

target: $('#usersss'),

source: function() {
            var db = decoara.webdb.db;

            db.transaction(function(tx) {
                tx.executeSql("SELECT codigo as value, fantasia as label, tabela FROM clientes WHERE fantasia LIKE '%"+$("#username").val()+"%' LIMIT 4",null, 

                    function (tx, results) {
                        jsonClientes = '[';
                        console.log('Rows:'+results.rows.length);

                        for (i=0; i<results.rows.length; i++) {
                            row = results.rows.item(i);
                            jsonClientes += '{"value":'+row['value']+',"label":"'+row['label']+'"}';

                            if (i!=results.rows.length-1)
                                jsonClientes += ',';
                        }
                        jsonClientes += ']';
                        console.log(jsonClientes);
                        return $.parseJSON(jsonClientes);
                    },function (tx, e) {
                        console.log('error: ' + e.message);
                    }
                );  
            });
        },
        link: 'xxx.html?ops=',
        minLength: 1
    });    

ソースの関数は、次の json コードを返します。

 [{"value":27,"label":"NARDIM"},{"value":38,"label":"MORO"},{"value":39,"label":"MH"},{"value":40,"label":"IRMAO SAPIENZA"}]

しかし、リストビューは表示されません。同じ JSON データを使用してソースを var に変更すると、正常に動作します。

var autocompleteData = $.parseJSON('[{"value":27,"label":"NARDIM"},{"value":38,"label":"MORO"},{"value":39,"label":"MH"},{"value":40,"label":"IRMAO SAPIENZA"}]');

source: autocompleteData,

何故ですか?

4

2 に答える 2

0

データベースの処理は非同期で行われます。.autocomplete() が呼び出されると、「ソース」の関数が呼び出され、そこでデータベース クエリが実行されます。しかし、このデータベース クエリ tx.executeSql() は将来いつでも終了し (非同期)、オートコンプリートの「ソース」には結果がありません。

残念ながら、この種の jquery アドオンでこれを解決する方法がわからないので、特定のデータベース クエリに関するオートコンプリートを構築することにしました。基本的に、データベース クエリから開始し、オートコンプリート ドロップダウンを埋める tx.executeSql() のコールバックを提供します。

于 2014-03-24T09:48:04.850 に答える
0

jsonClientes を配列として宣言してから、.push を使用してその中に値を格納してみてください。すなわち

var jsonClientes = [];
                        console.log('Rows:'+results.rows.length);

                        for (i=0; i<results.rows.length; i++) {
                            row = results.rows.item(i);
                            jsonClientes.push ('{"value:"'+row.value+'",label:"'+row.label+'"},');
                        }
于 2013-03-08T03:53:05.290 に答える