Knockout не обновляет страницу с текущими данными

У меня проблемы с нокаутом, который не обновляет мое представление должным образом... что происходит, так это то, что я делаю вызов ajax, чтобы получить данные своего представления, а затем использую нокаут для его визуализации. При последующих запросах я делаю вызов 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. Новые данные, поступающие в IS, отличаются. 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