2014-11-06 53 views
0

我得到了一個使用角度過濾器的搜索輸入,它工作正常,但有一件事我需要修復但未能至。如果用戶沒有輸入實際存在於scope.names數組中的任何名稱中的字符,那麼我不希望包含搜索匹配的div完全顯示。這if語句:if (keyValue != scope.names[i].charAt(j))總是由於某種原因評估爲真,所以即使找到了匹配,也不會顯示div。我檢查了循環是否按照預期工作,並且確實如此,所以問題不在於此。我究竟做錯了什麼?循環訪問名稱數組並檢查按鍵的值是否與名稱中的某個字符匹配

這是被存儲的名稱:

app.controller('addressBookController', function ($scope) { 

    $scope.names = []; 
}); 

而這裏的處理隱藏/顯示代碼:

var input = document.getElementById('search'); 
    input.addEventListener('keyup', function(e) { 

     var scope = angular.element(document.getElementById('address-book')).scope(); 
     var searchHits = document.getElementById('search-hits'); 
     var keyValue = String.fromCharCode(e.keyCode); 
      keyValue = keyValue.toLowerCase() + keyValue.slice(1);  

      if (input.value.length >= 0) { 
       searchHits.style.display = 'block'; 
      } 

      if (input.value.length === 0) { 
       searchHits.style.display = 'none';  
      } 

      for (i = 0; i < scope.names.length; i++) { 

       for (j = 0; j < scope.names[i].length; j++) { 

        if (keyValue != scope.names[i].charAt(j)) { 
         searchHits.style.display = 'none';  
        } 
       } 
      } 

回答

2

的問題是下面隱藏的div中時的邏輯未命中。

if (keyValue != scope.names[i].charAt(j)) { 
    searchHits.style.display = 'none';  
} 

可以說,用戶輸入「a」和你的數組包含一個名稱爲「BA」,因此,當循環開始明顯'a' != 'b'將是真實的,從而隱藏你的DIV未再unhided。
而不是做這個的,你可以修改你的邏輯如下(有采用了棱角分明ngShow其他更好的方法):

for (var i = 0; i < scope.names.length; i++) { 
    if (scope.names[i].indexOf(keyValue) === -1) { 
     searchHits.style.display = 'none'; 
    } 
} 

以上的邏輯是按照您的要求,並會隱藏searchHits格的情況下的鍵值不存在在所有的名字。

+0

不得不用一個顯示div的else調整你的代碼,然後返回。但現在它的作品:) – Chrillewoodz 2014-11-06 10:50:43

+0

偉大。您也可以嘗試在循環中使用var displayFlag,並在退出循環後根據標誌值僅設置一次元素顯示樣式。 – Amitesh 2014-11-06 11:27:23

相關問題