2016-08-22 5 views
0

코드 설명은 다음과 같습니다. 여기 자동 완성 기능에서 서버의 결과가 표시되지 않는 경우가 있음

은 내가 사용하고있는 자동 완성이다 (하지만 난 3 개 다른 자동 완성 패키지를 조사했습니다, 그들은 모두 같은 방식으로 작동) :

https://goodies.pixabay.com/javascript/auto-complete/demo.html

그리고 여기에 내가 그것을 사용하고 어떻게 (나는 사용자가 검색 창에 입력 할 때 내 자동 완성을 업데이트 할 수 있도록 socket.io와 함께 자동 완성을 사용하고 주) 클라이언트 측 : 그래서 여기

socket.on('searchBarResults', function(data) { 

var my_autoComplete = new autoComplete({ 
    selector: 'input[name="searchbar4"]', 
    minChars: 1, 
    cache: false, 
    source: function(term, suggest){ 
     term = term.toLowerCase(); 
     var choices = [ 
      data[0]._source.movie 
     ]; 
     var matches = []; 
     for (i=0; i<choices.length; i++) 
      if (~choices[i].toLowerCase().indexOf(term)) matches.push(choices[i]); 
     suggest(matches); 
    } 
}); 

    $searchBar4.on('input', function(event){ 
     my_autoComplete.destroy(); 
    }); 
}); 

는 모든 무엇입니까 이 작업은 사용자가 영화의 이름을 입력하기 시작하면 입력 한 모든 단어가있는 후에 서버가 일치하는 항목을 데이터베이스에서 검색하고 그 결과를 클라이언트에 보냅니다. 예를 들어

: 사용자가 스타를 검색하는 경우, 서버는 다시 스타 트렉 발견되지 않는 나라 전송되며, 검색 창은 스타 트렉 발견되지 않는 나라라는 자동 완성 옵션 표시됩니다.

잘 작동합니다.

만약 사용자 유형 스타 트렉 서버가, 다시, 다시 스타 트렉 발견되지 않는 나라 전송되며, 자동 완성이 업데이트됩니다. 괜찮아. 사용자 유형 스타 나라는 서버 다시 스타 트렉 발견되지 않는 나라 보낼 경우

하지만 자동 완성는 표시되지 않습니다 : 여기에

는 내가 가지고있는 문제입니다.

단어가 인 경우 자동 완성은 결과 만 표시합니다 (단어를 건너 뛸 수 없음).

사용자가 단어를 검색 상자에 입력하는 순서와 상관없이 에 항상의 결과를 표시하려면 어떻게 자동 완성을 할 수 있습니까?

답변

1

문제는 당신이다 :

if (~choices[i].toLowerCase().indexOf(term)) matches.push(choices[i]); 

이라는 용어를 일치하지 않는 모든 항목을 제거합니다.

"Star Trek Undiscovered Country".toLowerCase().indexOf("Star Country")

그것은 반환 -1은 그 전체 문자열을 포함하지 않기 때문에. 단어를 여러 단어로 나눠서 하나씩 비교해야합니다.

var match = function(term, suggest){ 
 
     term = term.toLowerCase(); 
 

 
     // for debugging. 
 
     var choices = new Array(); 
 
     choices.push('Star Trek Undiscovered Country'); 
 

 
     var matches = []; 
 
     for (i=0; i<choices.length; i++) 
 
     { 
 
      var allMatches = true; 
 
      var words = term.split(' '); // Split into words and check them individually. 
 

 
      //TODO: Possibly handle case when there is only one word. 
 

 
      for(var y = 0; y<words.length; y++) 
 
      { 
 
       // Check if this word is in choices[i]. 
 
       if (choices[i].toLowerCase().indexOf(words[y]) == -1) 
 
       { 
 
        // Not a match. 
 
        allMatches = false; 
 
        // Possibly continue when allMatches == false, since the following words doesn't matter. 
 
       } 
 
      } 
 
      if(allMatches) 
 
      { 
 
       matches.push(choices[i]); 
 
      } 
 
     } 
 
     suggest(matches); 
 
    } 
 

 
var suggest = function(item){ 
 
    console.log(item); 
 
}; 
 
match('Star Country', suggest); // Returns one item. 
 
match('Star Blaster', suggest); // Returns no items.
또한

, 항상 1 개 항목을 배열 할 것이다 choices로 보인다 : 당신이 뭔가를 할 수 있어야한다

? 왜 배열을 사용합니까?

+0

작동하지 않는 것 같습니다. 특히,'indexOf (word) == -1'에 대해서'(word)'의 사용에 관해서 말하고 있습니다 : * 예기치 않은 (커스텀/상속 된) 멤버들에 대한 반복 가능성, 아마도 hasOwnPropery가 없다 ... * – MonkeyOnARock

+0

좋아, 'indexOf (word) == -1'을'indexOf (word) == 0'으로 바꾸면 처음에는 작동하는 것처럼 보입니다. ** Star Country **를 입력하면 이제 ** Star Trek Untiscovered Country ** 결과를 얻게됩니다. 더 많은 테스트를하고 나중에 확인하겠습니다. – MonkeyOnARock

+0

그래, 틀렸어. 코드를 작업 스 니펫으로 업데이트했습니다. – smoksnes

관련 문제