Knockout не актуализира страницата с текущи данни

Имам проблем с това, че knockout не актуализира изгледа ми правилно... това, което се случва, е, че правя ajax повикване, за да получа данните си за изгледа, след което използвам knockout, за да го изобразя. При последващи заявки правя ajax повикване, за да получа данните за изгледа и след това актуализирам страницата с новите неща.

Проблемът е, че при повикване 2,3,4 и т.н... Страницата не се обновява с новите данни. Използвам плъгина за картографиране, което може да е проблемът.

if (filterLogModel == null) {
    filterLogModel = ko.mapping.fromJS(data);
    ko.applyBindings(filterLogModel, document.getElementById("dvFilterLog"));
} else {
    ko.mapping.fromJS(data, filterLogModel);
}

Мислех, че това е правилният модел за използване, но може би не?

Неща, които вече проверих: 1 - Че новите данни, които идват, СА различни 2 - Пропуснах през програмата за отстраняване на грешки и първата заявка минава през блока IF, а следващите заявки преминават през блока ELSE.

ако върнатите данни не съдържат данни, част от моя html има условие за това

<div id="filterLogResults">
<!-- ko if: $data.length <= 0 -->
    <p class="attention">There are no errors for this task.</p>
<!-- /ko -->
<!-- ko if: $data.length > 0 -->
    <table class="tbl">
        <thead>
            <tr>
                <th>Description</th>
                <th>Value 1</th>
                <th>Operator</th>
                <th>Value 2</th>
                <th>Corrective Action</th>
            </tr>
        </thead>
        <tbody data-bind="foreach: $data">
            <tr>
                <td class="nowrap" data-bind="text:Description"></td>
                <td class="nowrap" data-bind="text:Value1"></td>
                <td class="nowrap" data-bind="text:OperatorName"></td>
                <td class="nowrap" data-bind="text:Value2"></td>
                <td class="main" data-bind="text:CorrectiveAction"></td>
            </tr>
        </tbody>
    </table>
<!-- /ko -->
</div>

и изгледът се актуализира и ми казва, че няма резултати... но когато има данни, все едно показва кеширан изглед или нещо подобно, а не новите данни.

Още нещо, което забелязах. Ако първата заявка съдържа някои данни. Второто искане не съдържа данни. Третата заявка съдържа някои данни. - в този случай 3-тата заявка ще покаже новите данни, а не данните от първата заявка. Изглежда, че се случва само когато има 2 заявки подред, които имат данни, които изгледът не актуализира.

Някакви идеи как да поправя това?

Редактиране: Пълен JS

function getFilterLogs(suppressErrors, callback) {
    $("#filterLogResults").hide();
    if (!g_objCommon.isBoolean(suppressErrors)) {
        suppressErrors = false;
    }
    if (filterLogAjaxRequest != null) {
        filterLogAjaxRequestAborted = true;
        filterLogAjaxRequest.abort();
    }
    g_objCommon.showLoading();
    filterLogAjaxRequest = $.ajax({
        cache: false,
        type: "GET",
        url: absoluteRootPath + "api/Tasks/GetFilterLogs?id=" + g_nWorklistId,
        contentType: "application/json",
        success: function (data) {
            filterLogAjaxRequest = null;
            g_objCommon.hideLoading();
            if (filterLogModel == null) {
                filterLogModel = ko.mapping.fromJS(data);
                ko.applyBindings(filterLogModel, document.getElementById("dvFilterLog"));
            } else {
                ko.mapping.fromJS(data, {}, filterLogModel);
            }
            if ($.isFunction(callback)) {
                callback(data.length);
            }
            $("#filterLogResults").show();
            $("#filterLogResults .tbl").show();
        },
        error: function () {
            filterLogAjaxRequest = null;
            g_objCommon.hideLoading();
            if (!filterLogAjaxRequestAborted) {
                if (!suppressErrors) {
                    g_objCommon.showErrorModal("There was an error loading the errors.", undefined);
                }
                if ($.isFunction(callback)) {
                    callback(0);
                }
                $("#filterLogResults .attention").show();
                $("#filterLogResults .tbl").hide();
                $("#filterLogResults").show();
            }
            filterLogAjaxRequestAborted = false;
        }
    });
}

person Rush Frisby    schedule 12.04.2013    source източник
comment
Имам прост пример тук jsfiddle.net/sujesharukil/z8vpx, това ли е функционалността, която търсите за?   -  person Sujesh Arukil    schedule 16.04.2013


Отговори (1)


Откривам, че плъгинът за картографиране понякога не актуализира модела на изглед, освен ако няма добавен обект за картографиране към списъка с параметри, изпратени до него:

ko.mapping.fromJS(data, {}, filterLogModel);
person Paul Manzotti    schedule 12.04.2013
comment
Можете ли да добавите кода, който прави повикването, за да получите и данните, трябва още малко, за да продължите. - person Paul Manzotti; 15.04.2013