2017-09-13 67 views
9

我正在使用Jquery的Selectize标记库,它对我来说目前效果很好。Jquery Selectize在Ajax选项的顶部添加“全部清除”链接

下面是我用过的代码。

JavaScript代码:

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

PHP代码:

/* API for autocomplete list of properties */ 
Route::post('/search-property-autocomplete', function() { 
    if (!empty(trim($_POST['q']))) { 
     $search_term = trim($_POST['q']); 


     // getting Suburb State and Postcode of the properties based on search 
     $query = Property::join('technobrave_suburbs_', function($join) { 

        $join->on('technobrave_properties_.suburb_id', '=', 'technobrave_suburbs_.id'); 
       }); 

     $query->join('technobrave_states_', function($join) { 
      $join->on('technobrave_properties_.state_id', '=', 'technobrave_states_.id'); 
     }); 


     $query->select('technobrave_properties_.*', 'technobrave_suburbs_.suburb', 'technobrave_states_.state_name'); 

     $query->where(function($query) use ($search_term) { 
      $query->where('technobrave_properties_.post_code', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_suburbs_.suburb', 'LIKE', '%' . $search_term . '%'); 
      $query->orwhere('technobrave_states_.state_name', 'LIKE', '%' . $search_term . '%'); 
     }); 
     $data = $query->take(8)->get(); // getting maximum 8 records only 

     if ($data) { 
      foreach ($data as $current_record) { 
       $result[] = array(
        'address' => $current_record->suburb . ' ' . $current_record->state_name . ' ' . $current_record->post_code 
       ); 
      } 
     } 
    } else { 
     $result = []; 
    } 
    echo json_encode(array('properties' => $result)); 
}); 

正如你可以看到在上面的代码中,我使用Ajax来填充数据,并通过调用我的PHP越来越记录功能工作得很好。

现在,我想在我的所有结果顶部添加一个项目作为超链接,如全部清除每当我搜索或输入我的输入框时都会出现。

如果我点击清除全部链接,应该清除下面附加的结果。

要使用由Selectize提供的clearoptions()事件,我已经更新了我的​​符合我的JavaScript代码:

create: function(input, callback) { 

    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      callback(); 
     }, 
     success: function(res) { 

      return callback({ address: "<a href='javascript:void(0)'>Clear All</a>" }); 

     } 
    }); 


}, 

但它似乎没有工作,因为我看不到我的添加选项那里。填充结果后,我无法看到我的超链接。

我已经知道使用下面的somethink代码会在我搜索后删除我填充的记录。

$('.my-hyperlink-custom-class').on('click', function() { 
    control.clearOptions(); 
}); 

但我坚持追加或推新的项目,以我的代码与我填充使用Ajax的结果。

有人可以指导我如何实现这一目标。

回答

1

非常感谢大家的帮助和支持。并特别感谢@afeique的提示来实现此功能。

这是我最终想出的解决方案。

$('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: true,  
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 
     $(".selectize-input input[placeholder]").attr("style", "width: 100%;"); 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 

     // Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       console.log(res.properties); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 


$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

我修改我的代码位,并把下面的代码在我load事件追加在我的建议标签选择“全部清除”锚标记。

// Appending only if not exists 
     if($('.clearAllSuggestions').length == 0) { 
      $(".selectize-dropdown").append('<a href="#" class="clearAllSuggestions">Clear All</a>'); 
     } 

然后,我只是想清除缓存和选项,因此我把下面的代码。

$('body').on('click', '.clearAllSuggestions', function() { 

    var $select = $('#q').selectize({}); 
    var control = $select[0].selectize; 
    control.clearCache('option'); 
    control.clearOptions(); 
    control.refreshOptions(true); 
}); 

希望这会有所帮助。

4

这是我写的脚本。这会改变以上的所有href属性与javascript:;,而下面的将保持不变。您可以根据您的需要修改此属性。

$(".row").click(function(){ 
 
var present = $(this).index(); 
 
console.log("present"+present) 
 
$(this).closest('.container').find('.row').each(function(index,element){ 
 
    console.log("eachindex"+$(this).index()); 
 
    \t if($(this).index()>=present) { 
 
    \t 
 
    } 
 
    else { 
 
    \t $(this).attr("href","javascript:;"); 
 
    } 
 
}) 
 
$(".row").each(function(){ 
 
    \t $("#finalAttribute").append($(this).attr("href")); 
 
}) 
 
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<div class="container"> 
 
    <a class="row row1" href="#1"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row2" href="#2"> 
 
    R1 
 
    </a> 
 
    <br/> 
 
    <a class="row row3" href="#3"> 
 
    R2 
 
    </a> 
 
    <br/> 
 
    <a class="row row4" href="#4"> 
 
    R3 
 
    </a> 
 
    <br/> 
 
      <a class="row row5" href="#5"> 
 
    R4 
 
    </a> 
 
    <br/> 
 
</div> 
 
<div id="finalAttribute"> 
 

 

 
</div>

3

原谅我,我没有与Selectize经验,但我可以用自己的examples扫描并发现了一些可能会有所帮助:

$('#input-tags3').selectize({ 
    plugins: ['remove_button'], 
    delimiter: ',', 
    persist: false, 
    create: function(input) { 
     return { 
      value: input, 
      text: input 
     } 
    } 
}); 

在这个例子中,​​函数原型function(input)只有一个参数,没有回调函数。您的代码使用以下原型:create: function(input, callback)。从Selectize示例中,我只看到load:使用function(input, callback)

我建议改变你​​的东西沿着线:

create: function(input) { 
    // append "clear all" anchor to top of search div 
    $("#searchDiv").append('<a href="#" class="clearAll">Clear All</a>') 

    // perform autocomplete AJAX 
    $.ajax({ 
     url: base_url + '/search-property-autocomplete', 
     type: 'POST', 
     dataType: 'json', 
     data: { 
      q: query, 

     }, 
     error: function() { 
      // add text 
      return input; 
     }, 
     success: function(res) { 
      // TODO: do something to display the autocomplete results 
      // e.g. create a dropdown with autcomplete suggestions 
      // TODO: handle user selecting one of the suggestions 

      // add text 
      return input; 
     } 
    }); 


}, 

,并填写必要的TODO s到得到你想要的功能。

HTH

+1

你的答案以某种方式帮助我解决或实现我想要的。因此我选择你的答案给予赏金奖励。但是,如果有人坚持同样的问题,我提供了我的答案作为最终的代码。谢谢。 –

+1

[这里](https://stackoverflow.com/a/46398821/6829420)是我想出来的。 –

3

您试图实现的内容可以做一点不同。 使用创建当您选择顶部显示的添加...选项时,回调会创建不在最初选项列表中的新项目。这不是你想要的。

试试看:

var $select = $('#q').selectize({ 
    plugins: ['remove_button'], 
    valueField: 'address', 
    labelField: 'address', 
    searchField: 'address',     
    create: false, 
    score: function() { return function() { return 1; }; }, 
    render: { 
     item: function(data, escape) { 
      return '<div>' + escape(data.address) + '</div>'; 
     } 

    }, 
    onChange: function(value) { 

     if(value == 'Clear All') { 
      var control = $select[0].selectize; 
      control.clearOptions(); 
     } 
    }, 
    load: function(query, callback) { 
     if (!query.length) return callback(); 
     $.ajax({ 
      url: base_url + '/search-property-autocomplete', 
      type: 'POST', 
      dataType: 'json', 
      data: { 
       q: query, 

      }, 
      error: function() { 
       callback(); 
      }, 
      success: function(res) { 
       // add the clear All option on top. 
       res.properties.unshift({address: "Clear All" }); 
       callback(res.properties); 
      } 
     }); 
    } 
}); 

这增加了一个额外的选择和使用onChange事件时选择清除选项。

还要注意得分选项,以便禁用默认筛选。

4

你可以试试这个方法,我相信你的问题是用DOM渲染和绑定JS函数。由于该元素在加载时不可用,因此该元素不能通过与javascript绑定。下面的方法将起作用。

$('body').on('click', '.my-hyperlink-custom-class', function() { 
    control.clearOptions(); 
}); 

这里我已经将函数绑定到body,但是我再次检查目标元素是否是.my-hyperlink-custom-class。