初始化关键字的视图到许多视图 - 骨干

时间:2014-08-08 13:20:28

标签: javascript backbone.js backbone-views backbone-collections

我正在使用一些搜索功能,每次用户输入文本输入时我都会过滤一个集合,这里是代码,

userSearch: function() {
    var that = this;
    var letters = $('.js-user-search').val();
    this.filteredCollection.reset(that.filterUsers( that.collection, letters));

    var resultsList = new app.SearchUserResults({
        collection: this.filteredCollection
    });

    resultsList.render();
},

filterUsers: function( collection, filterValue) {
    var filteredCollection;

    if (filterValue === "") {
        return collection.toJSON();
    }

    return filteredCollection = collection.filter(function(data) {

        return _.some(_.values(data.toJSON()), function(value) {

            if( value != undefined ) {

                value = (!isNaN(value) ? value.toString() : value);
                //var re = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;

                return value.indexOf(filterValue) >= 0;

            }

        });

    });

}

从上面的代码中可以看出,我将一个集合(用户)和搜索参数传递给filterUsers(),然后返回一组匹配的模型。然后我尝试将其呈现为搜索结果列表(链接),但这些链接上的事件会运行多次(取决于搜索字符串的长度)。

如何构建返回集合的结果列表?我试过添加,

this.filteredCollection.on('reset', this.doSomething);但是这似乎永远不会运行,我也尝试在初始化函数中初始化我的结果视图,但我无法将集合传递给该视图,因为它是空的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

你必须小心骨干中的观点。您不断添加新的搜索结果视图而不删除旧的搜索结果视图。始终保持对您多次添加的视图的引用,以便您可以删除上一个视图。我认为这部分会帮助你:

var myCurrentSearchList = null;

userSearch: function() {
  var that = this;
  var letters = $('.js-user-search').val();
  this.filteredCollection.reset(that.filterUsers( that.collection, letters));
  if (myCurrentSearchList) {
    myCurrentSearchList.remove();
  }
  var resultsList = new app.SearchUserResults({
    collection: this.filteredCollection
  });
  myCurrentSearchList = resultsList;

  resultsList.render();
},

http://backbonejs.org/#View-remove