Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jquery Can';在.ajax调用之后更新Knockout.js ViewModel_Jquery_Ajax_Knockout.js - Fatal编程技术网

Jquery Can';在.ajax调用之后更新Knockout.js ViewModel

Jquery Can';在.ajax调用之后更新Knockout.js ViewModel,jquery,ajax,knockout.js,Jquery,Ajax,Knockout.js,在初始页面加载时,我的数据加载良好。我有一个delete函数,它通过.ajax调用我的控制器,删除数据库OK中的项目,然后发回JSON项目的新列表。在我调用ko.mapping.fromJS(data.newData,viewModel)之前,一切都正常,然后页面就会暂停,没有错误消息。如果我添加一个警报(data.newData),我会看到正确的Json。下面是代码,有人能看到我做错了什么吗 <script> var initialData = @Html.Raw(Json.Enc

在初始页面加载时,我的数据加载良好。我有一个delete函数,它通过.ajax调用我的控制器,删除数据库OK中的项目,然后发回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>

var initialData=@Html.Raw(Json.Encode(Model));
var viewModel={
培训文件:ko.observableArray(初始数据)
};
函数deleteDoc(doc){
$.ajax({
url:“/Admin/_DeleteTrainingDocument/”+doc.TrainingDocumentId,
类型:“POST”,
数据:“,
成功:功能(数据){
if(data.Result){
$(“#userMessage”).html(“+data.Message”);
fromJS(data.newData,viewModel);
}否则{
$(“#userMessage”).html(“+data.Message”);
}
},
错误:函数(jqXhr、textStatus、errorshown){
警报(“错误”“+jqXhr.status+”(文本状态:“+textStatus+”,错误抛出:“+Error抛出+”));
},
完成:函数(){
}
});
};
应用绑定(viewModel、document.body);
标题
行动
​
结果

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

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

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

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

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


另外,对于更新调用,我将密切关注
数据.newData
包含的内容,因为我怀疑您可能需要使用
viewModel.trainingDocs
,而不仅仅是
viewModel
,如果数据是实际数组。

您还可以添加显示数据绑定的html吗?最好是一个JSFIDLE显示您的errorOK peacemaker,我编辑了我的问题并添加了html。我对Knockout.js是全新的,所以我对jsfiddle还不够熟悉,尽管我已经看过一些例子。谢谢!!!“viewModel.trainingDocs而不仅仅是viewModel”解决了这个问题,您的其他评论也很有用。刚刚开始使用Knockout.js框架,它看起来非常有用。