如何根据选择标准获取数据而没有冗余?

时间:2013-05-17 17:57:44

标签: knockout.js

我正在创建一个页面,其中包含用于过滤结果的搜索按钮。为此,我还有两个三组合用于过滤器选择。我的问题是,当我第一次列出结果并与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');}

如果有人能帮助我,我将感激不尽。 提前谢谢。

0 个答案:

没有答案