2012-08-22 62 views
1

後,無法更新Knockout.js ViewModel在初始頁面加載時,我的數據正常加載。我有一個刪除函數,它通過.ajax調用我的控制器並刪除數據庫中的項目OK,然後發回新的JSON項目列表。一切工作,直到我調用ko.mapping.fromJS(data.newData,viewModel),然後頁面停止,沒有錯誤消息。如果我添加一個警報(data.newData),我會看到正確的Json。以下是代碼,任何人都可以看到我做錯了什麼?在.ajax調用

<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> 
+0

你還可以添加你的HTML顯示數據綁定?更好的將是一個jsfiddle顯示你的錯誤 – peacemaker

+0

OK調解人,我編輯我的問題,並添加了HTML。我對Knockout.js是全新的,所以我還沒有對jsfiddle有足夠的瞭解,儘管我已經看到了它的一些例子。 –

回答

2

我不知道確切的結構,從你的AJAX調用返回,但如果要更新現有的數據,你要麼需要:使用映射插件像

  • 創建原始observableArray :

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

  • 或傳遞空映射選項,如在回調時更新:

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

此外,對於更新的呼叫,我將密切注意什麼data.newData包含的,因爲我會懷疑你可能需要使用viewModel.trainingDocs,而不是僅僅viewModel,如果數據是實際數組。

+0

謝謝RP! 「viewModel.trainingDocs而不是viewModel」解決了這個問題,你的其他評論也是有益的。剛開始使用Knockout.js框架,它看起來非常有用。 –