我正在创建一个页面,其中包含用于过滤结果的搜索按钮。为此,我还有两个三组合用于过滤器选择。我的问题是,当我第一次列出结果并与viewModel绑定时,它显示正确的结果。当我在列表上应用搜索时完全加载列表后,我的搜索方法返回正确选择的项目集,但是当我将结果数据再次绑定到视图模型时,它在结果数据中显示重复数据。对于每个结果项(行),它显示多行。
我已经在observableArrayList对象上尝试了removeAll()。我正在使用ObservableArrayList作为表中显示的列表。
在下面的示例代码中,FruitViewModel是一个模型,它给出了不同类别和c_data的所有水果的列表 - 有类别
按钮btnSearch调用setShowType方法,该方法根据过滤值获取列表。
makeShowObjectList - 此方法返回过滤器结果列表,这很好。 (在语句与viewModel绑定后,它显示了不需要的结果(重复行)
记住:如果我的表目前有5行,之后我应用搜索,如果makeShowObjectList返回3行,那么表数据将显示5行,每个结果项表示总共15行。对于每一行,它将打印5次重复的行。
HTML:
<script>
fruitViewModel= new FruitViewModel(c_data);
$(function() {
ko.applyBindings(FruitViewModel);
}
</script>
<tbody data-bind="foreach: showList()">
<tr>
<td data-bind="text: fruitName"></td>
<td data-bind="text: FruitViewModel.showList().length"></td>
</tr>
</tbody>
<a href="#" class="btnSearch" data-bind="click: setShowType" style="height: 19px;">Search</a>
Knockout.js
var FruitViewModel=function(c_data)
{
self.showList=ko.observableArray([]);
self. showList = makeShowObjectList(BucketViewModel, urls.a,self.selecteddata());
self. setShowType = function(d, e) {
self.showList=ko.observableArray([])
self. showList = makeShowObjectList(BucketViewModel,urls.a,self.selecteddata());
ko.applyBindings(fruitViewModel);
}
}
function makeShowObjectList(model, d_url, fruit) {
var showobjectList = ko.observableArray([]);
showobjectList.prependToList = function (s) {
for (var id in s) {
var old = new model(s[id], showobjectList.prependToList);
for (var idx in showobjectList())
{
if (showobjectList()[idx].pk() == old.pk())
{
console.log('d');
return;
}
}
showobjectList.unshift(old);
}
}
$.post(d_url, data, function (response_data) {
showobjectList.prependToList(response_data.p.items);
if (!showobjectList.is_ready)
{
//Here we are trying to relaod the list on the page FruitViewModel.showobjectList=showobjectList;
showobjectList.is_ready = true;
showobjectList.onready();
}
}
}, 'json');}
如果有人能帮助我,我将感激不尽。 提前谢谢。