在backbone.js框架中使用Visualsearch.js

时间:2011-11-29 08:34:35

标签: javascript couchdb backbone.js

首先,感谢DocumentCloud的人发布这两个超级有用的工具。

这是我的问题:

我正在尝试在backbone.js app中使用visulasearch.js。

在我的应用程序中,我有一个基本的index.html和一个myapp.js javascript文件,其中包含使用backbone.js完成的主要应用程序

我使用CouchDB作为数据存储,并且我成功地可以以一种安静的方式检索要放入集合中的所有数据。
我必须检索visualsearch.js给出的搜索查询并使用它来过滤集合 我肯定需要一个搜索框的视图,当命中输入时触发一个事件,但是..

  1. 我应该在另外的js文件或我的index.html页面(如visualsearch mini.tutorial中所建议的)在myapp.js外部初始化搜索框吗? 或者我应该在搜索框视图(myapp.js)中初始化它?后一种解决方案似乎太棘手了(这是我试图做的,但即使我成功了,它太复杂了,我也失去了bacbone mvc的简单性。)

  2. 假设我成功将搜索字符串检索为{name:'Fat DAvid', address:'24, slim st', phone:'0098876534287'}等JSON对象。完成后,我可以使用哪个函数在集合中检索其字段与给定字符串匹配的模型。我知道我应该做一个地图或过滤器,但这些功能似乎本身就可以用于稍微不同的任务。

    一个。它真的是过滤结果的最佳方式吗?它向客户端收费(必须过滤结果),而对CouchDB进行新的查询(视图或过滤器)会非常简单,并且考虑到少量数据和对站点的低访问率,而不是那么昂贵。但是,在客户端进行所有过滤操作,它比在CouchDB中创建新视图(或列表或过滤器)并将其链接到backbone.js视图要简单得多

1 个答案:

答案 0 :(得分:1)

您可以在myapp.js中初始化您的VisualSearch.js搜索框。只需确保保留对它的引用,以便稍后可以提取出构面和值。

例如:

var visualSearch = VS.init({...})
// Returns the unstructured search query
visualSearch.searchBox.value() 
// "country: "South Africa" account: 5-samuel title: "Pentagon Papers""

// Returns an array of Facet model instances
visualSearch.searchQuery.facets()
// [FacetModel<country:"South Africa">, 
//  FacetModel<account:5-samuel>, 
//  FacetModel<title:"Pentagon Papers">]

如果您在Backbone集合中使用这些模型,则可以轻松执行过滤:

var facets = visualSearch.searchQuery.models;
_.each(facets, function(facet) {
    switch (facet.get('category')) {
        case 'country':
            CountriesCollection.select(function(country) { 
                return country.get('name') == facet.get('value'); 
            });
        break;
        // etc...
    }
});