0

此代码段有效,它正确地将表产品和列名称中的数据设置为 YII 的引导预输入扩展的输入。

但是,我最终从具有大量数据的 Table Product 中编写了一个 SELECT ALL。

我们可以修改它,以便可以在用户输入事件上将 WHERE 条件添加到 DataProvider 中。根据输入的每个字母,然后可以触发一个新查询并且只检索数据的一个子集?

            <?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" ), 
            )); ?>  
4

1 回答 1

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(搜索)的 a 不需要访问服务器)。

或者,您可以启动一个计时器,该计时器有效地等待用户停止输入,以避免每次按键都击中服务器的行为。从技术上讲,这会导致反馈速度变慢,但对服务器和移动用户来说更好。这适用于流量很大的网站。

于 2013-04-28T20:35:07.607 回答