2015-09-30 18 views
0

我使用sergeyt:typeahead在我的流星應用程序中創建了一個typeahead搜索字段。來自typeahead搜索輸入的日誌信息

現在我想記錄所有的搜索請求,以知道我的數據庫中缺少哪些信息。事情是,用戶可能不會按輸入。由於typehead功能,用戶將輸入一些字符,如果沒有結果,他們可能會中止輸入。一些用戶將刪除輸入以嘗試其他關鍵字。如果技術上可行,我希望獲得這些信息。

所以首先我要檢查typeahead有多少結果給我,但我不知道從哪裏得到這些信息。

這是我到目前爲止的代碼:

Template.search.helpers({ 
    searchData: function() { 
     return [ 
      { 
       name: 'cat1', 
       valueKey: 'title', 
       displayKey: 'title', 
       header: '<h3 class="category-name">Category 1</h3>', 
       template: 'searchResults', 
       local: function() { return Collection.find().fetch(); } 
      } 
     ] 
    }, 
    selected: function(event, suggestion) { 
     if (Router.routes[suggestion.type] === void 0) { 
      console.warn('Route not found'); 
      return; 
     } 
     else Router.go(suggestion.type, { _id : suggestion.id }); 
    } 
}); 

我會爲模板事件開始:

Template.search.events({ 
    'submit form': function(event, template) { 
     event.preventDefault(); 
     var newElement = template.firstNode.children[0][1].value; 
     Log.insert({ title: newElement, missing: true }); 
    }, 
    'keyup input': function(event, template) { 
     var keyword = event.target.value; 
     Log.insert({ title: keyword }); 
    } 
}); 
  1. 提交事件:所以如果用戶按下回車,關鍵字將被保存到集合中。但是這是非常糟糕的,因爲如果沒有鍵入結果,就會發生這種情況,因爲用戶可以選擇一個建議,然後按回車鍵以獲得該結果,但是使用我的代碼,這將被覆蓋...

  2. 鍵盤事件:問題是,每個鍵盤事件都會被跟蹤。對於輸入'正在搜索',將會有14個插入到集合中。這不是我想要的。如果我使用更改事件,輸入必須弄清楚,這也不是我所需要的。

所以這在我看來不是最好的方法。

也許有可能使用typeahead.js的自定義事件,如typeahead:render

回答

0

使用下劃線的trottle只保存搜索字符串每500ms左右。這將減少您保存的唯一搜索字符串的數量,同時仍然捕獲用戶的大部分來回。

你的情況:

Template.search.events({ 
    'submit form': _.throttle(function(event, template) { 
     event.preventDefault(); 
     var newElement = template.firstNode.children[0][1].value; 
     Log.insert({ title: newElement, missing: true }); 
     },500); 
    }, 
    'keyup input': _.throttle(function(event, template) { 
     var keyword = event.target.value; 
     Log.insert({ title: keyword }); 
     },500); 
    } 
}); 

你的要求是有點矛盾所以這似乎是一個合理的妥協。您想要捕獲搜索字符串,但不是搜索字符串中輸入的每個字符。如果你不油門和用戶類型:

f o o d 

那麼通常你會節省4個搜索:

  1. ˚F
  2. FO
  3. 食品

然後,如果他們決定退格一個角色,您將再次保存:

隨着節流,假定用戶類型在一個相當正常的頁面,您將節省兩個搜索:

  1. 食品

由於他們想必會考慮他們與食物一起獲得的結果,並認爲他們太過分了r(至少500ms),然後退格。

+0

這是一個很好的主意,但我仍然有問題,提交事件將覆蓋typeahead-enter-event。 – user3848987

+0

我會使用「輸入」事件。這將處理鍵盤事件以及複製/粘貼。也許與'blur'結合使用 –

+0

可以在沒有underscore.js的情況下進行節流嗎?我只是問,因爲underscore.js有很多的功能,但我不需要它們...... – user3848987