2013-06-20 1 views
0

내 양식에서 서버에서로드 된 값이 변경되었습니다. 나는이 같은 기능을 작성하는 경우 (경우 - 다른 부분 (statusChanged) 내가 $ .grep 기능을 "add""remove"로 2 회를 ​​호출 오전에이 기능에

$(checkBox).each(function(i,el){ 
      status.push($(el).prop("checked")); 

      $(el).click(function(){ 
       var clickedIndex = checkBox.index($(this)); 
       var prevStatus = status[clickedIndex]; 

       if(prevStatus !== $(this).prop("checked")){ 
        statusChanged.push($(this).val() + ($(this).prop("checked") ? add.toLowerCase() : remove.toLowerCase())); 
       }else{ 
        var that = $(this); 
        statusChanged = $.grep(statusChanged, function(value) { 
         return value != that.val() + add.toLowerCase() 
        }); 

        statusChanged = $.grep(statusChanged, function(value) { 
         return value != that.val() + remove.toLowerCase() 
        }); 
       } 

       console.log(statusChanged); 

      }) 

     }) 

: 그것을 위해 나는이 기능을하고있는 중이 야 그 부분 만)

var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() || that.val() + remove.toLowerCase() //not working 
}); 

작동하지 않습니까? 여기 또는 $, grep은 (또는 ||) 삼항 연산자를 수락하지 않거나 다른 하나의 짧은 메서드를 제공합니다. pls

감사합니다.

답변

1

"$, GREP이 동의하지 않거나 (||) 삼항 연산자"

에 라인을 변경해보십시오 그렇습니다. $.grep()은 함수가 부울을 반환 할 것으로 기대하지만 부울을 가져 오는 방법은 중요하지 않습니다.

질문이 value 추가하거나 당신이 할 수있는 한 후 제거되지 않았는지 확인하는 방법 인 경우 :

value value 제거되지 않은 추가되지 않았는지, 시험이
var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() 
      && value != that.val() + remove.toLowerCase(); 
}); 

-하지만 다른 값이 될 수 있습니다.

그것은 종류의 안 좋아요 .val().toLowerCase() 콜백 그래도 호출 될 때마다로 통화를하고있는 것 같다, 그래서 아마 이런 걸 할 거라고 :이 코드를 실행, 사실

var val = $(this).val(), 
    valAdd = val + add.toLowerCase(), 
    valRemove = val + remove.toLowerCase(); 
statusChanged = $.grep(statusChanged, function(value) { 
    return value != valAdd && value != valRemove; 
}); 
0

저는 이것이 연산자 우선 순위와 관련이 있다고 생각합니다. +!=보다 높은 precendece를가집니다. 또한 로직에 결함이 있습니다. 값이 이 아닌지인지 확인하고 싶습니다.

return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase()); 

참조 : JavaScript Operator Precendence

1

을 :

statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + add.toLowerCase() 
}); 

statusChanged = $.grep(statusChanged, function(value) { 
    return value != that.val() + remove.toLowerCase() 
}); 

or 운전 동작 (||)를 수행하지 이다. and입니다. 하나의 조건에서 목록을 필터링 한 다음 두 번째 조건에서 동일한 목록을 필터링하면 두 조건 모두에서 필터링됩니다 (and). 그들 중 하나가 아닙니다 (or).

은 무엇 당신이해야 할 것은 당신의 새로운 코드에서 &&을 사용하는 것입니다

var that = $(this); 
statusChanged = $.grep(statusChanged, function(value) { 
    return (value != that.val() + add.toLowerCase()) && (value != that.val() + remove.toLowerCase()); 
}); 

편집 :

또한, 언급 된 다른 답변의 일부처럼, 당신이 우선 순위를 가지고 조심해야한다 . 개별 케이스를 괄호로 묶습니다 (위의 상자에 추가 한 것과 같습니다).