Javascript 实现Knockout.js破坏性foreach循环
以下是包含数据绑定元素的html:Javascript 实现Knockout.js破坏性foreach循环,javascript,arrays,knockout.js,Javascript,Arrays,Knockout.js,以下是包含数据绑定元素的html: div data-bind="foreach: clientRequests" id="test2"> <div class="list-group" > <a href="#" class="list-group-item active"><b data-bind="text: client"></b></a>
div data-bind="foreach: clientRequests" id="test2">
<div class="list-group" >
<a href="#" class="list-group-item active"><b data-bind="text: client"></b></a>
<a href="#" class="list-group-item"><b>Priority: </b><b data-bind="text: client_priority"></b></a>
<a href="#" class="list-group-item"><b>Title: </b><b data-bind="text: title"></b></a>
<a href="#" class="list-group-item"><b>Description: </b><b data-bind="text: description"></b></a>
<a href="#" class="list-group-item"><b>Product Area: </b><b data-bind="text: product_area"></b></a>
<a href="#" class="list-group-item"><b>Target Date: </b><b data-bind="text: target_date"></b></a>
<a href="#" class="list-group-item"><b>Ticket URL: </b><b data-bind="text: ticket_url"></b></a>
</div>
</div>
对于不同的AJAX调用,会返回不同的RequestArray。例如,在初始页面加载之后,进行一个AJAX调用,该调用接收requestArray的一个实例,该实例可能包含10个项。foreach循环的行为似乎与预期的一样,数组中的所有10项都填充在页面上。然后,进行第二个AJAX调用,但这次数组可能只有5个项。每个项目重复两次,页面上总共出现10个项目
问题似乎是,即使之前调用了ko.cleanNode(document.getElementById('test2'))
:
ko.applyBindings({
clientRequests: requestsArray
}, document.getElementById('test2'))
对于每个新数组,每个foreach
迭代创建的HTML元素的数量随着每个新数组的增加而不断增加。使用Vue.js,每次向数据绑定和for循环传递一个新数组时,它本质上是破坏性的,不会保留数组上一次迭代中的任何内容
显然,在这种情况下使用
ko.cleanNode
在这里不起作用,我知道有一个示例可以执行我认为正确的过程,但每次只能通过按钮和self.array.remove(此)
,执行一个html元素,我不太清楚如何调整它,以便彻底清除从数组foreach
迭代创建的所有html元素 我不明白为什么必须手动重新应用绑定。具有可观察阵列的视图模型的整体观点是,knockout为您处理数据更新。。。通常,当您使用cleanNode
时,有一种更简单的方法来做事情
你试过这样的东西吗
//应用绑定一次,viewmodel实例不会更改
//在请求之间
应用绑定(新的ViewModel());
函数ViewModel(){
//因为数组是可观察的,所以将
//监视更改并更新UI
this.requests=ko.observearray([]);
//视图模型具有请求方法
//.done回调将结果写入可观察对象
//请求数组
this.doRequest=函数(){
mockupAjaxGetter().done(this.requests);
}.约束(本);
//提出初步要求
这是doRequest();
};
//模拟代码,只是在超时时生成一些随机数
函数mockupAjaxGetter(){
var randomResults=[];
对于(变量i=0;i
新请求
为什么不在每次调用Ajax时清空模型中的数组?1@Matt.kaaj我正在这样做,将在帖子中更新我的代码。这对Knockout.js绑定的情况没有帮助。更新数组本身不是问题,而是通过每个新数组的每次foreach迭代创建的html元素的累积。
ko.applyBindings({
clientRequests: requestsArray
}, document.getElementById('test2'))