此代码段有效并且它正确地将表产品和列名称中的数据设置为YII的bootstrap typeahead扩展的输入。
但是,我最终从Table Product中编写了一个SELECT ALL,它具有大量数据。
我们可以修改它,以便可以在用户输入事件的DataProvider上添加WHERE条件。根据输入的每个字母表,可以触发一个新的查询,只检索一部分数据?
<?php
$dataProvider = new CActiveDataProvider('Product');
$dataArray = $dataProvider->getData();
$myarray = array();
foreach ($dataArray as $data){
array_push($myarray, CHtml::encode($data->name));
}
$this->widget('bootstrap.widgets.TbTypeahead', array(
'name' => 'typeahead',
'options'=>array(
'name'=>'typeahead',
'source'=>$myarray,
'items'=>4,
'matcher'=>"js:function(item) {
return ~item.toLowerCase().indexOf(this.query.toLowerCase());
}",
),
'htmlOptions'=>array('class'=>'search-query span3', 'placeholder'=>"Search" ),
)); ?>
答案 0 :(得分:3)
一旦开始向source
提供功能,您就有权操纵发生的事情,包括发送请求的频率。
minLength: 3, // <- custom option
source: function(query, process) {
var longEnough = query.length >= this.options.minLength;
// you can create custom variables (this.search) that a remembered across
// searches
if (longEnough && (! this.search || whateverRuleYouWantToLimitBy)) {
// remember the query so that you can compare it to the next one
this.search = query;
$.ajax({
url: '/ajaxsearch.php?value=' + query,
type: "GET",
success: process
});
}
}
我有一些类似的代码,我缓存了Ajax代码返回的结果,然后我看到新的query
字符串是否有可能改变结果(例如,如果你限制为4个结果,但我只有3个结果,然后只需添加到最后query
(搜索)的query
就不需要点击服务器了。
或者,您可以启动一个有效等待用户停止输入的计时器,以避免每按一次按键击中服务器的行为。从技术上讲,这会导致反馈速度变慢,但对服务器和移动用户来说更好。这适用于流量很大的网站。