0

phonegap/jquery モバイル アプリを作成していますが、解決できない問題があります。

アプリが読み込まれると (デバイスの準備ができて jqm_mobile_init)、アプリがデータベースを作成/開き、ユーザーがサインインしているかどうかを確認します (データベース内のフラグのみ)。その場合、アプリは $.mobile.changePage("#home", {transition:"none"}); を呼び出します。それらを「ホームページ」にリダイレクトします。

次に、「ホームページ」ページの pageshow イベントで、データベースから大量の情報を取得し、それをホームページ内のリストビューに追加します。

ただし、これが初めて実行されたとき ($.mobile.changePage イベントを使用)、pageshow イベントはトリガーされません (そのため、私のデータはリストビューに追加されません)。アプリをナビゲートしてからページにアクセスすると、データは正常に表示されます。これは、$.mobile.changePage を使用してホームページに変更した場合にのみ発生します。

$.mobile.changePage で pageshow() を起動するにはどうすればよいですか? またはそれを行う別の方法はありますか?

私のコードは次のとおりです。

/************************************************
Try to create/open the DB, if not catch the error
***********************************************/
try {
    if (!window.openDatabase) {
        alert('not supported');
    } else {
        var shortName = 'test';
        var version = '1.0';
        var displayName = 'test Database';
        var maxSize = 200000; // in bytes
        // database instance in db.
        var db = openDatabase(shortName, version, displayName, maxSize);

        // Create tables
        createTables(db);

        // Check if there is a signedin user
        isUserSignedInQuery(db);

    }
} catch(e) {
    // Error handling code goes here.
    if (e == 2) {
        // Version number mismatch.
        alert("Invalid database version.");
    } else {
        alert("Unknown error "+e+".");
    }
    return;
}

// Universal null/blank data handler
function nullDataHandler(transaction, results) { }

// Universal error callback
function errorHandler(error) {
    //alert("Error processing SQL: " +error.message+ " Error Code: " +error.code);
}

// Create tables if dont already exist
function createTables(db) {
    db.transaction(
        function (transaction) {

            // create tables
    }
    );
}

/**********************************************************************************************
Check if there is a signed in user, if so redirect to listings page, if not display login page
**********************************************************************************************/

function isUserSignedInQuery(db) {
    db.transaction(
        function (transaction) {
            transaction.executeSql("SELECT * FROM USERS WHERE signedIn=1;",
            [], // array of values for the ? placeholders
            isUserSignedInDataHandler, errorHandler);
        }
    );
}

function isUserSignedInDataHandler(transaction, results) {
    // Handle the results
    if (results.rows.length > 0) {
        //console.log("someones logged in!");

        // Assign signed in user to global var
        console.log("logged in user = " + results.rows.item(0).id);
        window.currentSignedInUserId = results.rows.item(0).id;

        $.mobile.changePage( "#home", { transition: "none"} );
    } else {
        $.mobile.changePage( "#login", { transition: "none"} );
    }
}


/**********************************************************************************************
Sign in page:
**********************************************************************************************/

function doesSigningInUserAlreadyExistQuery(db) {
    db.transaction(
        function (transaction) {
            transaction.executeSql("SELECT * FROM USERS WHERE username='"+usernameValue+"' ORDER BY id LIMIT 0,1;",
            [], // array of values for the ? placeholders
            doesSigningInUserAlreadyExistDataHandler, errorHandler);
        }
    );
}

function doesSigningInUserAlreadyExistDataHandler(transaction, results) {

    // User exists, sign them in.
    if (results.rows.length > 0) {

        //console.log("user exists");

        // Find number of rows
        var len = results.rows.length;
        //console.log(len);

        for (var i=0; i<len; i++){
            //console.log(results.rows.item(i));

            db.transaction(
                function (transaction) {
                    transaction.executeSql('UPDATE USERS SET signedIn = 1 WHERE username="'+usernameValue+'"');
                }               
            );

            // Assign signed in user to global var
            window.currentSignedInUserId = results.rows.item(0).id;

            // Redirect to home/listings page
            $.mobile.changePage( "#home", { transition: "slidefade"} );
        }

    // User is new, create them and sign them in
    } else {

        db.transaction(
            function (transaction) {
                transaction.executeSql('INSERT INTO USERS (username, password, userId, defaultHandler, autoSync, updateCaseTypes'
                +', updateHistorical, updateFavorite, signedIn) '
                +'VALUES ("'+usernameValue+'", "eclipse", "userid321", "Another User", 1, 1, 1, 1, 1);', [],
                function (transaction, resultSet) {
                    if (!resultSet.rowsAffected) {
                        // Previous insert failed.
                        alert('No rows affected!');
                        return false;
                    }
                    alert('insert ID was '+resultSet.insertId);

                    //Assign signed in user to global var
                    window.currentSignedInUserId = resultSet.insertId;
                });
            }               
        );

        // Redirect to home/listings page
        $.mobile.changePage( "#home", { 
            reloadPage: true,
            transition: "slidefade"} );

    }
}

$('#login').live('pageshow', function(event) {

    console.log(window.currentSignedInUserId); // This is empty - global var not working

    // Should this be tap??????? Find out. -----------
    $('a#signIn').click(function() {

        // Get values of all fields & buld vars
        var username = $('#login-username');
        var password = $('#login-password');

        // Check if fields are empty
        if( !username.val() ) {
              username.addClass('empty');
              $('label.login-username').addClass('blank');
            }
            if( !password.val() ) {
              password.addClass('empty');
              $('label.login-password').addClass('blank');
            }

            // If both not empty, check if user exists, if so sql update if not sql insert
            if (username.val() && password.val()) {

                // Get username
                usernameValue = username.val();

                // Run function
                doesSigningInUserAlreadyExistQuery(db);

            }

    });
});


$('#home').live('pageshow', function(event) {

    console.log("Page show fired on recordings page");

    db.transaction(getRecordingsQuery, getRecordingsDataHandler, errorHandler);

            // get stuff, loop through it and append

        // Refresh the list to add JQM styles etc
        $('#recordings-list').listview('refresh');

    }

});
4

2 に答える 2

1

私はそれを解決することができましたが、それは実際には適切な修正ではありませんが、画面の更新中に画面のちらつきを犠牲にして機能します.

誰にも役立つ場合は、allowSamePageTransitions: true を追加して問題を解決しました (ちらつきを犠牲にして)。

于 2012-11-09T16:31:47.467 に答える
0

on()の代わりにを使用する必要がありlive()ます。live()非推奨になりました。代わりに
入れてみましたか?データ収集/動的ページ要素の生成を配置するのに適した場所のようです。beforepageshowpageshow

于 2012-11-08T17:16:33.610 に答える