在.ajax调用后无法更新Knockout.js ViewModel

时间:2012-08-22 22:34:42

标签: jquery ajax knockout.js

在初始页面加载时,我的数据被正确加载。我有一个删除函数,通过.ajax调用我的控制器并删除数据库中的项目确定,然后发送回新的JSON项列表。一切正常,直到我调用ko.mapping.fromJS(data.newData,viewModel)然后页面停止而没有错误消息。如果我添加警报(data.newData),我会看到正确的Json。以下是代码,谁能看到我做错了什么?

<script>
var initialData = @Html.Raw(Json.Encode(Model));

var viewModel = {
    trainingDocs : ko.observableArray(initialData)
};

function deleteDoc(doc) {
    $.ajax({
        url: "/Admin/_DeleteTrainingDocument/"+doc.TrainingDocumentId,
        type: "POST",
        data: "",
        success: function (data) {
            if (data.Result) {
                $("#userMessage").html("<img src='/content/Status_1.png' align='bottom' />" + data.Message);
                ko.mapping.fromJS(data.newData, viewModel);
            } else {
                $("#userMessage").html("<img src='/content/Status_0.png' align='bottom' />" + data.Message);
            }
        },
        error: function (jqXhr, textStatus, errorThrown) {
            alert("Error '" + jqXhr.status + "' (textStatus: '" + textStatus + "', errorThrown: '" + errorThrown + "')");
        },
        complete: function () {
        }
    });
};

ko.applyBindings(viewModel, document.body);
</script>

<table class="agent-info">
<thead>
    <tr> 
        <th>Title</th> 
        <th>Action</th> 
    </tr> 
</thead>
<tbody data-bind="foreach: trainingDocs">
    <tr> 
        <td><span data-bind="text:Title"></span></td> 
        <td><a href="#" id="whiteLinks" data-bind="click: function() { if(confirm('Are you sure you want to delete '+$data.Title+'?')) deleteDoc($data) }">delete</a></td>
    </tr> 
</tbody>
</table>​
<div id="userMessage">
    Results
</div>

1 个答案:

答案 0 :(得分:2)

我不确定从AJAX调用返回的确切结构,但如果要更新现有数据,则需要:

  • 使用映射插件创建原始的observableArray,如:

    var viewModel = { trainingDocs : ko.mapping.fromJS(initialData) };

  • 或在回调中更新时传递空映射选项,如:

    ko.mapping.fromJS(data.newData, {}, viewModel);

此外,对于更新通话,我会密切关注data.newData包含的内容,因为我怀疑您可能需要使用viewModel.trainingDocs而不只是viewModel,如果data是实际的数组。