1

私はAdobe AIR、HTMLおよびjavascriptバージョンを使用して簡単なアプリケーションを開発しています。

アプリケーションはオンライン URL にフォームを送信します。

フォームの値は JSON 文字列です。

この関数を使用してデータを送信しています:

function fetchStudents()
{

    var stmt = new air.SQLStatement();
        stmt.sqlConnection = conn;
        stmt.text = "SELECT * FROM studentsTable2 WHERE deleted='0'";
        stmt.addEventListener(air.SQLEvent.RESULT, function(event){ 

            var result = event.target.getResult();
            sync_students = JSON.stringify(result.data);

            fetchCourses(); 
        });
        stmt.addEventListener(air.SQLErrorEvent.ERROR, errorHandler);
        stmt.execute();
}

JSON.stringifyADOBE AIR でのプレビューを使用して、DREAMWEAVER でアプリケーションをテストすると動作します。

sync_students次に、正しくフォーマットされたテーブルからのすべてのデータで満たされた JSON 文字列です。

しかし、AIR ファイルを作成し、アプリケーションをインストールして実行すると、動作しなくなります。

sync_studentsJSON文字列ですが、完全に空です...[{},{},{}]

私は多くのことを読み、JSON2.js などを使用するための提案を見てきました。これらを試しましたが、成功していません。

これは私を夢中にさせています。どんな助けでも大歓迎です。

よろしくお願いします!

4

1 に答える 1

0

この質問の受け入れられた答えを見てください。ここでの問題は、ガベージ コレクションが一部の var を「早すぎる」ように再利用することでした。つまり、スコープは baaad です。:

AIR Sqlite: SQLEvent.RESULT が起動しないが、ステートメントは正しく実行されている

編集:これはすべて範囲の問題です。これをよりよく理解するには、「javascript scope」および「javascriptclosure」キーワードを調べる必要があります(私が提案する場合)。

javascript で「クラス」を定義するための ONE WAYに関する (非常に) 短い要約を以下に示します。

var MyNameSpace = {};  
var MyNameSpace.SchoolDataSource = function() {
  this.publicMember = 2;
  this.publicFunction = function(x) {
        var newValue = this.publicMember + _privateMemberOne + x;   
        return _privateFunctionMul2(newValue); 
     } ;
  var _privateMemberOne = 1;
  var _privateFunctionMul2 = function (y) { return 2*y; } ;
};

var mySchoolDataSource = new MyNameSpace.SchoolDataSource();

mySchoolDataSource.publicFunction(3); // ok. (returns (3+2+1) * 2 = 12)
var bar = mySchoolDataSource.publicMember; // ok. ( === 2)
mySchoolDataSource._privateFunctionMul2(4); does not work, which is what we want.
var foo= mySchoolDataSource._privateMemberOne; // does not work, which is what we want.
于 2012-10-24T13:11:52.103 に答える