Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/398.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
Javascript 使用淘汰JS在ajax调用后刷新列表_Javascript_Knockout.js - Fatal编程技术网

Javascript 使用淘汰JS在ajax调用后刷新列表

Javascript 使用淘汰JS在ajax调用后刷新列表,javascript,knockout.js,Javascript,Knockout.js,我在一个页面上有一个附件列表,它是使用jQuery$.ajax调用和Knockout JS生成的 我的HTML看起来像(这是剥离回来的): 我有一个函数,用于获取作为JSON响应返回的附件列表: $(函数(){ getFormatAttachments(); }); 函数getAttachments(){ var请求=$.ajax({ 键入:“获取”, 数据类型:“json”, url:“/Attachment/GetAttachments” }); 请求完成(功能(响应){ ko.应用绑定

我在一个页面上有一个附件列表,它是使用jQuery
$.ajax
调用和Knockout JS生成的

我的HTML看起来像(这是剥离回来的):


我有一个函数,用于获取作为JSON响应返回的附件列表:

$(函数(){
getFormatAttachments();
});
函数getAttachments(){
var请求=$.ajax({
键入:“获取”,
数据类型:“json”,
url:“/Attachment/GetAttachments”
});
请求完成(功能(响应){
ko.应用绑定(新vm(响应));
});
}
我的视图模型如下所示:

功能虚拟机(响应){
this.attachments=ko.observearray(响应);
};
有一个刷新按钮,用户可以单击该按钮刷新此列表,因为随着时间的推移,附件可能已被添加/删除:

$(函数(){
$(“刷新”)。在(“单击”,获取附件);
});
附件列表的初始呈现很好,但是当我通过刷新按钮再次调用
getAttachments
时,单击列表将添加到列表中(事实上,每个项目都重复了几次)

我创建了一个JSFIDLE来演示这个问题:


我做错了什么?

这是一把小提琴,可以修复您的样品。您最大的问题是多次调用“applyBindings”。通常,在页面加载时调用applyBindings,然后页面将与视图模型交互,以使Knockout刷新页面的某些部分

html


文件名
刷新
javascript

$(函数(){
var ViewModel=函数(){
var self=这个;
self.count=0;
self.getAttachments=函数(){
var data=[{Filename:“f”+(self.count*2+1)+“.doc”},
{Filename:“f”+(self.count*2+2)+“.doc”}];
self.count=self.count+1;
返回数据;
}
self.attachments=ko.observearray(self.getAttachments());
self.refresh=函数(){
self.attachments(self.getAttachments());
}
};
应用绑定(新的ViewModel());
});
--

您可能还想看看映射插件-。它可以帮助您将JSON转换为视图模型。此外,它还可以将属性指定为对象的“键”。。。这将用于确定后续映射上的旧对象与新对象

这是我不久前写的一把小提琴,用来展示一个类似的想法:


注意:我使用“更新”作为映射规则的一部分,但只有这样我才能登录到控制台。如果您想自定义映射插件更新对象的方式,则只需添加此项

凯文-不错的帖子。我还是有点困惑。新的淘汰赛。我在页面加载中加载带有AJAX数据的ViewModel时遇到了类似的问题。我肯定我错过了一个很小但很严重的要点。让我困惑的是,一些教程将
viewmodel
显示为对象(例如
var-viewmodel={something:ko.observable()}
),而另一些教程则显示为函数(例如
function-viewmodel(){this.something=ko.observable()}
)-有什么建议吗?@one.beat.consumer-请参阅我的后续问题:-下面的答案和评论应该会让事情更清楚。我建议你花25美元看这个:我来看看你的另一个问题;非常感谢。我订阅了pluralsight,我已经看了2-3遍了。。。他们几乎没有触及表面,而且很多都是旧的,现在2.0已经推出,他们使用的是1.2或1.3测试版…如果说我没有数据,我需要调用一个Ajax方法,它是一个GET,那么这将如何工作?只需更改getAttachments调用以进行Ajax调用,并在回调中将结果直接设置到attachments observable数组中。刷新将只调用self.getAttachments()。附件将被初始化为空,然后您可以立即调用self.getAttachments()进行第一次AJAX调用。一旦回调设置了结果,Knockout将负责刷新您的UI。嗯,由于某些原因,我无法使用此方法刷新数据,请参阅我的问题: