0

我在敲除无法正确更新我的视图时遇到问题......发生的情况是我进行了 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 - 进来的新数据不同 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>

并且视图确实更新并告诉我没有结果......但是当有数据时,它就像显示缓存视图或其他内容,而不是新数据。

我注意到的另一件事。如果第一个请求包含一些数据。第二个请求不包含数据。第三个请求包含一些数据。- 在这种情况下,第三个请求将显示新数据,而不是第一个请求的数据。只有当一行中有 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;
        }
    });
}
4

1 回答 1

2

我发现映射插件有时不会更新视图模型,除非有一个映射对象添加到通过它发送的参数列表中:

ko.mapping.fromJS(data, {}, filterLogModel);
于 2013-04-12T18:32:24.297 回答