2015-10-15 59 views
0

我是骨干js的新手。我正在尝试创建一个显示特定数据的应用程序,并允许用户使用特定属性对它们进行过滤并缩小结果范围。我提取的数据有三个字段:组织名称,组织类型和国家。用户可以通过从下拉列表中选择组织类型和国家来应用过滤器。组织类型和国家可以是多个。我使用jQuery的select2来允许用户选择多个组织类型和国家。在输入字段上的每个按键上过滤组织名称。我设法创建了一个筛选器,根据所有三个属性单独筛选记录。这里是我的收藏以及我的过滤功能:骨干筛选使用多个属性的集合

var OrganisationCollection = Backbone.PageableCollection.extend({ 
    model: Organisation, 
    state: {pageSize: 20}, 
    mode: "client", 
    queryParams: { 
    currentPage: "current_page", 
    pageSize: "page_size" 
    }, 

    filterBy: function(organisationName, organisationType, countryName){ 
    var matchingModels; 
    var filterFunction = function(model) { 
     var check = (model.get('name').indexOf(organisationName)>-1); 
     return check; 
    } 
    collectionToFilter = this; 
    matchingModels = filteredCollection(collectionToFilter, filterFunction); 

    function filteredCollection(original, filterFn) { 
     var filtered; 
     // Instantiate new collection 
     filtered = new original.constructor(); 
     // Remove events associated with original 
     filtered._callbacks = {}; 
     filtered.filterItems = function(filter) { 
     var items; 
     items = original.filter(filter); 
     filtered._currentFilter = filterFn; 
     return filtered.reset(items); 
     }; 
     // Refilter when original collection is modified 
     original.on('reset change destroy', function() { 
     return filtered.filterItems(filtered._currentFilter); 
     }); 
     return filtered.filterItems(filterFn); 
    }; 
    collectionToFilter = new OrganisationCollection(matchingModels); 
    return collectionToFilter; 
    } 
}); 

现在,此过滤功能仅过滤基于组织名称的集合。如果我要筛选基于机构类型我的收藏,我的filterBy功能是:

filterBy: function(organisationName, organisationType, countryName){ 
    var matchingModels; 
    var filterFunction = function(model) { 
    var check = typeof organisationType=='string' ? (model.get('type').indexOf(organisationType)>-1) : (_.indexOf(organisationType, model.get('type')) > -1); 
    return check; 
    } 
    collectionToFilter = this; 
    matchingModels = filteredCollection(collectionToFilter, filterFunction); // filterFunction would be same as above 
    collectionToFilter = new OrganisationCollection(matchingModels); 
    return collectionToFilter; 
} 

filterBy国家功能将类似于以上。 现在我的问题是,这三个函数单独工作正常。但我无法合并这三个功能来缩小结果。 当用户过滤美国和澳大利亚的国家类型的公司和多边的时候,只有来自美国和澳大利亚的公司类型和公司类型的组织应该显示。再次,在这些结果中,如果用户在组织名称输入字段中键入'A',则只会显示以字母'A'开头的以前结果的组织。我不知道如何实现这一点。 这里是我的功能,触发过滤器:

$(document).ready(function(){ 
    var country = $("#filter-country").val(); 
    var countryName = country ? country : ''; 
    var type = $("#filter-org-type").val(); 
    var orgType = type ? type : ''; 
    var orgName = ''; 

    $("#filter").on('input',function(e){ 
    var orgFilter = $('#filter').val(); 
    orgName = orgFilter ? orgFilter : ''; 
    orgCollection.trigger("filter-by-organisation",orgName, orgType, countryName); 
    }); 
// Users can select countries from select field #filter-country and types from select field #filter-org-type and click on button #apply-filters to trigger filter function 
    $(document).on('click', '#apply-filters', function(){ 
    orgCollection.trigger("filter-by-organisation",orgName, orgType, countryName); 
    }); 
}); 

请帮我这个。由于

回答

0

我可能没有理解你的问题非常好,但你可以简单地做这样的事情:

var OrganisationCollection = Backbone.PageableCollection.extend({ 
    model: Organisation, 
    filterBy: function(organisationName, organisationType, countryName) { 
    var organisationNameResults = this.filter(function(model) { 
     // your logic for filtering based on organisationName 
    }); 
    var organisationTypenResults = _.filter(organisationNameResults, function(model) { 
     // your logic for filtering based on organisationType 
    }); 
    var countryNameResults = _.filter(organisationTypenResults, function(model) { 
     // your logic for filtering based on countryName 
    }); 
    this.reset(countryNameResults); 
    } 
}); 

可以重构,这只是给你一个想法

+1

谢谢..链接实际上确实解决了这个问题。有一件事,但下划线的过滤方法不适合我。它显示模型未在控制台中定义。我不得不使用this.filter()而不是_.filter() – jimmypage