1

最初のページの読み込みで、データが正常に読み込まれます。.ajax を介してコントローラーを呼び出し、データベース内のアイテムを削除し、JSON アイテムの新しいリストを返す削除関数があります。ko.mapping.fromJS(data.newData, viewModel) を呼び出すまですべてが機能し、ページはエラー メッセージなしで停止します。alert(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>
4

1 に答える 1

2

AJAX 呼び出しから返される正確な構造はわかりませんが、既存のデータを更新する場合は、次のいずれかを行う必要があります。

  • 次のようなマッピング プラグインを使用して、元の observableArray を作成します。

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

  • または、次のようにコールバックで更新するときに空のマッピング オプションを渡します。

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

また、 update 呼び出しについては、データが実際の配列である場合、just の代わりに ,data.newDataを使用する必要があると思われるため、内容に細心の注意を払います。viewModel.trainingDocsviewModel

于 2012-08-23T13:33:11.550 に答える