У меня проблемы с нокаутом, который не обновляет мое представление должным образом... что происходит, так это то, что я делаю вызов 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;
}
});
}