2014-10-03 48 views
0

我有一个应用程序,我有多个搜索源。以前,用户必须在搜索之前选择搜索的来源。如果他们没有选择,应用程序将默认为其中一个选项。追加新的结果到开放的jQuery自动完成菜单

但是,现在他们想要同时搜索所有来源。这很好,但问题是当其中一个搜索返回时,它将覆盖以前的搜索结果。相当多预期的行为。我基本想要的是追加新的结果到已经打开的自动完成菜单,而不是覆盖旧的结果。自然,自动完成菜单在关闭时必须清空。

我想这是可能的,但最好的方法是什么?我可以有一个数组我猜,我追加结果,然后覆盖_renderMenu使用此数组,而不是传递给函数的项。然后在关闭事件中清空所述数组。

这是最好的方式吗?还是有更优雅的解决方案?

部分代码: 好的,所以searchAction最终由jquery自动完成调用。在collection.search中,我执行ajax调用,这里的URL基于这个参数创建,然后调用respondWhithData并将搜索结果映射为适当的格式(即自动完成菜单的值和标签)。在从respondWithData调用响应之后,jquery会自动呈现结果菜单。因此,我可能必须覆盖reponse事件函数以及_renderMenu和可能的_renderItem,是的?

searchAction: function(searchTerm, collection, response){ 
    var self = this; 
    $.when(collection.search(searchTerm, this)).then(function(data) { 
     self.respondWithData(data, response); 
    }); 
}, 
respondWithData : function(data, response) { 
    if (data.length > 0) { 
     var responseVal = _.map(data, this.mapData); 
     this.checkResponseCount(responseVal); 
     response(responseVal); 
    } 
    else { 
     response(this.emptyResult()); 
    } 
}, 

要清楚,问题不在于多重搜索本身,而在于渲染异步结果。我想呈现返回的第一个结果,然后在从服务器返回时立即追加其余结果。

编辑2: 只是试图在autocompleteresponse事件编辑ui.content,但一旦它呈现为某种原因,任何编辑不走......

编辑3:啊,ui.content只能是直接修改,没有改变。如果我推动每一个变化,而不是拼凑两个数组,ui.content显示我想要的。 它的作品我猜,但它不完美。

+0

请添加对搜索后的一些代码回 – Balder 2014-10-03 09:01:45

+0

做,但我不是很确定它如何帮助:) – benbjo 2014-10-03 10:04:06

+0

你能告诉我们哪些jQuery的自动完成你使用的插件?那里有很多Autocomplete插件。 – 2014-10-03 10:58:06

回答

0

我可以计算的外观您的方案,但我猜:

你应该有这样的:

function search1() { 
    $.ajax({ ... 
     success: function(data) { 
     $('#myResultsDiv").html(data) 
     } 
    });  
} 

代替overwritting的#myResultsDiv需要追加的结果像:

function search1() { 
    $.ajax({ ... 
     success: function(data) { 
     $('#myResultsDiv").append(data) 
     } 
    });  
} 

编辑:你也可以做这样的事情:

var resultsArray = []; var searchDone = 0; var totalSearchs = 5; //假设5个搜索

功能搜索1(){

function search1() { 
    $.ajax({ ... 
     success: function(data) { 
     //APPEND data to resultsArray 
     searchDone++; 
     if(searchDone==totalSearch) //syncronize the 5 searchs before render 
      renderSearchs(resultsArray); 

     } 
    });  
} 
+0

谢谢,但我不想同步所有的搜索显而易见的原因,即用户将不得不等待更长的时间,如果一个失败,等等。 搜索全部通过相同的ajax调用,但使用不同的URL。尽管你的解决方案并不能真正帮助我完成自动完成,但是在成功回调之后发生了一些事情。即,自动完成调用其响应函数,以及rendermenu和item。 – benbjo 2014-10-03 09:56:24