2014-01-10 92 views
8

我使用typeahead.js 0.9.3,它的工作方式很流行。我的問題是,是否可以在「typeahead:selected」事件(或任何事件)上從數據集中刪除數據。Twitter Typeahead.js - 根據選擇刪除數據

我在使用Typeahead的prefetch選項在頁面加載中提取數據集中的數據。我知道我可以撥打電子郵件$('selector').typeahead('destroy')並重新初始化打字頭,並在prefetch對象中使用filter,但重新調用數據似乎相當重量級(我們沒有在本地存儲中緩存數據)。

我想我正在尋找類似於filter函數的東西來遍歷基準數組並刪除先前選擇的(或所有選定的)數據。它看起來並不像公共職能那樣做,但也許我錯過了它。

我已經通過typeahead的文檔閱讀並在這裏搜索,但還沒有找到答案。

編輯:我從prefetch切換到local和使用AJAX post調用來獲取數據解決眼前的問題,將其設置爲一個全局變量,然後將它傳遞給typeahead,在那裏我可以添加/刪除從項目全球性的數據陣列,然後根據需要銷燬/重新整合預先輸入的數據。遠非理想,但它有效。

+0

爲什麼不將其傳遞到預輸入前幾個過濾數據? –

+0

因爲沒有任何機制可以在不調用'.typeahead('destroy')'的情況下對其進行「重新過濾」,並用另一個'prefetch'調用重新初始化'typeahead'。我不希望在'typeahead:selected'事件發生後'POST'。 – rpmartz

回答

0

正如你所指出的那樣,如果不是現行版本的大規模黑客攻擊,如果不是不可能的話,這是非常棘手的。 有你需要三樣東西:

  1. 遠程作爲一個功能選項(如果你實現自己的getter函數訪問您的數據,篩選查詢,並刪除您已經選擇的項目
  2. 。高速緩存控制:能夠拒絕鍵入控制使用高速緩存來執行上次執行的建議搜索
  3. 按需建議搜索,僅在需要時才刷新建議結果(當您進入輸入框並開始typin g你的查詢)。

下一個typeahead版本(0.10當前正在開發中)可能支持所需的功能。
但是......碰巧我的(Svakinn)typeheadhead支持你需要的所有三種條件。 您的配置應該提供getter函數,您可以從init數據中選擇數據,並通過查詢字符串和已經選擇的選項進行過濾。

remote: yourGetterFunction 

然後,你需要禁用建議緩存:

skipCache: true 

如果你不想等待下一次預輸入版本,我建議你嘗試一下:
https://github.com/Svakinn/typeahead.js/tree/typeaheadSimple 也有現場直播JQuery和Knockout示例可用:
https://github.com/Svakinn/typeahead.js/blob/typeaheadSimple/Examples.md

+0

這看起來不錯 - 我現在正在測試你的解決方案。 –

+0

偉大的工作Svakinn,在生產中使用。 –

-1

試試這個,這對我很有用。

$('#selector').typeahead('setQuery', ""); 
+0

所有這些都會清空查詢。它對'datum'數組沒有影響......調用'.typeahead('setQuery',「」)'不會清空選定的項目。 – rpmartz

12

您可以在任何Bloodhound數據集的Typeahead 0.10中實現此功能,無論是遠程,預取還是本地。

只需跟蹤哪些數據已經獨立於Bloodhound數據集而選擇,並且不要使用Bloodhound#ttAdapater()作爲您的打印源。 ttAdapter方法僅僅是Bloodhound#get(query, cb)的一個包裝 - 所以不是直接調用get(query, cb),而是使用自定義回調來檢查每個建議與當前選擇。

這裏有一個的jsfiddle - http://jsfiddle.net/likeuntomurphy/tvp9Q/

var selected = []; 

var select = function(e, datum, dataset) { 
    selected.push(datum.val); 
    $("#selected").text(JSON.stringify(selected)); 
    $("input.typeahead").typeahead("val", ""); 
} 

var filter = function(suggestions) { 
    return $.grep(suggestions, function(suggestion) { 
     return $.inArray(suggestion.val, selected) === -1; 
    }); 
} 

var data = new Bloodhound({ 
    name: 'animals', 
    local: [{ val: 'dog' }, { val: 'pig' }, { val: 'moose' }], 
    datumTokenizer: function(d) { 
     return Bloodhound.tokenizers.whitespace(d.val); 
    }, 
    queryTokenizer: Bloodhound.tokenizers.whitespace, 

    // custom suggestion filter is applied after Bloodhound 
    // limits the set of possible suggestions 
    // see comment by Basti below 
    limit: Infinity 
}); 

data.initialize(); 

$('input.typeahead').typeahead(null, 
    { 
     name: 'animals', 
     displayKey: 'val', 
    /* don't use 
     source: data.ttAdapter(), */ 
     source: function(query, cb) { 
      data.get(query, function(suggestions) { 
       cb(filter(suggestions)); 
      }); 
     }, 
     templates: { 
      empty: '<div class="empty-message">No matches.</div>' 
     } 
    } 
).bind('typeahead:selected', select); 
+0

這非常奏效。我已經找到了相當多的解決方案(當我知道我的遠程源中沒有更多結果時,我不想在每個typeahead事件中完全清除緩存)。很好的答案! :) – dave

+1

一個重要的補充:您還應該將Bloodhound的限制選項設置爲非常大的甚至Infinity,因爲在調用自定義過濾器之前應用了建議限制。最糟糕的情況:在100個可能的結果中,你會用自定義過濾器過濾掉5個,但由於建議限制導致空的結果,Bloodhound只會給你5個結果。 – Basti

+0

非常棒!我還沒有用足夠大的數據集來使用Bloodhound,因此必須有一個限制。 – likeuntomurphy