0

JQM/Phonegap アプリを作成していますが、厄介な問題があります。

websql/sqllite db からのデータを表示するページがあり、2 ~ 3 フィールド (#view?id=123) しかありません。このページを初めて表示すると、すべて正常に動作します (データを取得し、JQM pagebeforeshow イベント内のフィールドに値を追加します)。

別のレコード (#view?id=234) のページを再度表示すると、問題が発生します。最後に表示されたデータを含むページが表示され、約 1 ~ 2 秒後に現在のレコードの値に更新されます。

このページのキャッシュを停止する方法はありますか (それが問題です - 私は JQM キャッシュ データ属性を使用していません)、または pagehide イベントでフィールドを空にしようとする必要がありますか?

前もって感謝します。

説明したコード例:

$('#view').live('pagebeforeshow', function(event, data) {

    // Clear any interval counter 
    clearInterval(window.viewTimerIntervalID);

    // On page load get passed url vars
    if ($.mobile.pageData && ($.mobile.pageData.caseRef || $.mobile.pageData.id)){
        if ($.mobile.pageData.caseRef) {
            $('input#edit-case-ref').val($.mobile.pageData.caseRef);
        }
        if ($.mobile.pageData.id) {
            $('input#edit-recordId').val($.mobile.pageData.id)
        }
    }

    // Grab record ID from hidden field
    var editId = $('input#edit-recordId').val();

    // form fields
    var caseTypeSelect = $('select#edit-case-type-select'),
        taskTypeSelect = $('select#edit-task-type-select'),
        caseRef = $('input#edit-case-ref'),
        notes = $('textarea#edit-notes'),
        editTimer = $('#edit-time h1'),
        startButton = $('#editStartStopRecording'),
        findCaseRef = $('a#findCaseRef');
    var startButtonTextSpan = $('#editStartStopRecording').prev('span').find('span.ui-btn-text');
    startButton.button('refresh');


    // Empty values of fields
    caseTypeSelect.val([]);
    taskTypeSelect.val([]);
    caseRef.val('');
    notes.val('');
    editTimer.text("0:00:00");


    // Get options for first select
    function getCaseTypes(tx) {
        tx.executeSql('SELECT * FROM CASETYPES', [],
            function(tx,results){
                var len = results.rows.length;

                // Remove any options already appended.
                $('select#edit-case-type-select option').remove();

                // Cache CaseType Select
                var caseTypeSelect = $('select#edit-case-type-select');

                // Append the first empty blank value option
                caseTypeSelect.append('<option value="" data-placeholder="true">Select Case Type</option');

                for (var i=0; i<len; i++){
                    // Append Select with details
                    caseTypeSelect.append('<option value="' + results.rows.item(i).id +'">' + results.rows.item(i).description + '</option>');
                }

                // Refresh the list to add JQM styles etc
                caseTypeSelect.trigger("change");
            },
            errorCB
        );
    }

    // Get options for second select
    function getTaskTypes(tx) {
        tx.executeSql('SELECT * FROM ACTIONTYPES', [],
            function(tx,results){
                var len = results.rows.length;

                // Remove any options already appended.
                $('select#edit-task-type-select option').remove();

                // Cache CaseType Select
                var taskTypeSelect = $('select#edit-task-type-select');

                // Append the first empty blank value option
                taskTypeSelect.append('<option value="" data-placeholder="true">Select Task Type</option');

                for (var i=0; i<len; i++){

                    // Append Select with details
                    taskTypeSelect.append('<option value="' + results.rows.item(i).id +'">' + results.rows.item(i).description + '</option>');
                }

                // Refresh the list to add JQM styles etc
                taskTypeSelect.trigger("change");
            },
            errorCB
        );
    }

    // populate the selects with values from DB
    function getRecording(tx) {
        tx.executeSql('SELECT * FROM RECORDINGS WHERE id=?', [editId],
            function(tx,results){
                var len = results.rows.length;

                for (var i=0; i<len; i++){

                    // Add values to selects
                    caseTypeSelect.val(results.rows.item(i).caseTypeId);
                    taskTypeSelect.val(results.rows.item(i).actionTypeId);

                    // Store this start date as a global var
                    window.editStartDate = results.rows.item(i).startDate;

                    // Add value to inputs
                    caseRef.val(results.rows.item(i).caseRef);

                    // Add notes
                    notes.val(results.rows.item(i).notes);

                    // Refresh the list to add JQM styles etc
                    caseTypeSelect.trigger("change");
                    taskTypeSelect.trigger("change");

                    // Calculate the time if still recording and start timer
                    if (!results.rows.item(i).endDate) {

                        // No end date so still recording....
                        // Need to work out diff between start and now
                        // And increment

                        var start = new Date(results.rows.item(i).startDate);
                        var end = new Date();
                        var dateDiff =  end.getTime() - start.getTime();

                        milliSecs = dateDiff

                        // 1000 milliseconds in a second
                        msSecs = (1000)
                        // Convert to seconds
                        msMins = (msSecs * 60)
                        // Convert to mins
                        msHours = (msMins * 60)
                        // Floor and calc to hours
                        numHours = Math.floor(milliSecs/msHours)
                        // Calc Mins
                        numMins = Math.floor((milliSecs - (numHours * msHours)) / msMins)
                        // Calc secs 
                        numSecs = Math.floor((milliSecs - (numHours * msHours) - (numMins * msMins))/ msSecs)
                        // Add leading zeros
                        if (numSecs < 10){
                          numSecs = "0" + numSecs
                        }
                        if (numMins < 10){
                          numMins = "0" + numMins
                        }

                        // Calc results
                        timeOnLoad = numHours + ":" + numMins + ":" + numSecs;

                        // Add to timer
                        editTimer.text(timeOnLoad);

                        // Start the incrementor and put the incrementor id in a global var (wuldnt work inside a local var for some reason).
                        window.viewTimerIntervalID = setInterval(editCount,1000);

                        // Change the button
                        startButtonTextSpan.text('Pause');
                        startButton.buttonMarkup({theme: 'g'}); //Red
                        startButton.buttonMarkup({icon: 'minus'}); // Swap out for custom icons

                        // Add the stop class
                        startButton.addClass('stop');

                        // Disable all fields as still recording
                        caseTypeSelect.selectmenu('disable');
                        taskTypeSelect.selectmenu('disable');
                        caseRef.textinput('disable');
                        notes.textinput('disable');
                        findCaseRef.addClass('ui-disabled');


                    // Calculate the time if enddate exists
                    } else {

                        // There is an end time - so calc diff and append
                        // Get start and end date, convert to JS date objects and subtract
                        var start = new Date(results.rows.item(i).startDate);
                        var end = new Date(results.rows.item(i).endDate);
                        var dateDiff =  end.getTime() - start.getTime();

                        milliSecs = dateDiff

                        // 1000 milliseconds in a second
                        msSecs = (1000)
                        // Convert to seconds
                        msMins = (msSecs * 60)
                        // Convert to mins
                        msHours = (msMins * 60)
                        // Floor and calc to hours
                        numHours = Math.floor(milliSecs/msHours)
                        // Calc Mins
                        numMins = Math.floor((milliSecs - (numHours * msHours)) / msMins)
                        // Calc secs 
                        numSecs = Math.floor((milliSecs - (numHours * msHours) - (numMins * msMins))/ msSecs)
                        // Add leading zeros
                        if (numSecs < 10){
                          numSecs = "0" + numSecs
                        }
                        if (numMins < 10){
                          numMins = "0" + numMins
                        }

                        // Calc results
                        resultString = numHours + ":" + numMins + ":" + numSecs;

                        // Append data
                        editTimer.text(resultString);

                        // Change the button
                        startButtonTextSpan.text('Resume');
                        startButton.buttonMarkup({theme: 'f'}); //Green
                        startButton.buttonMarkup({icon: 'plus'});

                        // Add the stop class
                        startButton.addClass('resume');

                        // Enable all fields as not recording
                        caseTypeSelect.selectmenu('enable');
                        taskTypeSelect.selectmenu('enable');
                        caseRef.textinput('enable');
                        notes.textinput('enable');
                        findCaseRef.addClass('ui-enabled');

                    }
                }
            },
            errorCB
        );
    }

    // Populate select options from DB
    db.transaction(getCaseTypes, errorCB);
    db.transaction(getTaskTypes, errorCB);

    // Populate the fields with record details
    db.transaction(getRecording, errorCB);
});

また、関連性があるかどうかはわかりませんが、複数ページのテンプレート (すべての #pages in one html document) を使用しています。再度、感謝します。

4

2 に答える 2

1

キャッシュを無効にしてみてください:

$.mobile.page.prototype.options.domCache = false;

localStorage から特定の要素を削除することができます:

localStorage.removeItem(elementHere);

それが役に立てば幸い。

于 2013-01-29T17:56:59.420 に答える
0

pagebeforeshowイベント ハンドラーで値をクリアできます。

編集:

SQL トランザクションと JQM ページの変更を調整する必要があります。

1) pageChangeSQL Tx ハンドラー内から開始する

また

2) の既存の値をクリアしてpagebeforeshowから、SQL Tx を開始します。Tx 成功コールバックで利用可能な場合、画面に値を入力します。loadingこの待機中にアニメーションを表示できます。

于 2013-01-29T16:36:20.700 に答える