javascript
2013-01-03 2 views -1 likes 
-1
var canAssignMultiple="true"; 
var canWithdrawMultiple="true"; 

function onCheckUncheck() 
{ 
    if($(':checkbox[name^="checkedRecords"]:checked').length>0) 
    { 
     $("input[name='checkedRecords']:checked").each(function() 
     { 
      debugger; 
      var canAssign = $(this).attr("canAssign").toLowerCase(); 
      var canWithdraw = $(this).attr("canWithdraw").toLowerCase(); 
      canAssignMultiple= canAssignMultiple && canAssign; 
      canWithdrawMultiple= canWithdrawMultiple && canWithdraw; 
      if (canAssignMultiple == "false") 
       $("#assaignbutton").attr("disabled", "disabled"); 
      else 
       $("#assaignbutton").removeAttr("disabled"); 

      if (canWithdrawMultiple == "false") 
       $("#withdrawbutton").attr("disabled", "disabled"); 
      else 
       $("#withdrawbutton").removeAttr("disabled"); 
     }); 
    }   
    else 
    { 
     $("#assaignbutton").attr("disabled", "disabled"); 
     $("#withdrawbutton").attr("disabled", "disabled"); 
    } 
} 

Переменная canAssignMultiple становится истинным, когда каждый() функция вызывается во второй раз, хотя его значение изменилось с ложным в первом iteration.It должен сохранить свое значение evrytime runs.How петли сделать это?переменной не обновляет его значение

+0

Я боюсь, что строка '' false'' является правдой. Возможно, вы используете 'canAssign = false' в своем HTML? –

+0

Вы имеете в виду, что 'canAssignMultiple' становится строкой' 'true''? – LarsH

+1

Как сказал Ян, пожалуйста, покажите нам образец вашего HTML, чтобы мы могли видеть, какие значения атрибута 'canAssign'. – LarsH

ответ

0

boolean (ложные, истинные) значения отличаются strings ("ложный", "истинный")

попробовать

var canAssignMultiple = true; 
var canWithdrawMultiple = true; 

function onCheckUncheck() { 
    if ($(':checkbox[name^="checkedRecords"]:checked').length > 0) { 
     $("input[name='checkedRecords']:checked").each(function() { 
      debugger; 
      var canAssign = $(this).attr("canAssign").toLowerCase() == "true"; // make this a boolean expression 
      var canWithdraw = $(this).attr("canWithdraw").toLowerCase() == "true"; // make this a boolean expression 
      canAssignMultiple = canAssignMultiple && canAssign; 
      canWithdrawMultiple = canWithdrawMultiple && canWithdraw; 
      if (canAssignMultiple === false) $("#assaignbutton").attr("disabled", "disabled"); // use false (instead of "false") 
      else $("#assaignbutton").removeAttr("disabled"); 
      if (canWithdrawMultiple === false) $("#withdrawbutton").attr("disabled", "disabled"); // use false (instead of "false") 
      else $("#withdrawbutton").removeAttr("disabled"); 
     }); 
    } 
    else { 
     $("#assaignbutton").attr("disabled", "disabled"); 
     $("#withdrawbutton").attr("disabled", "disabled"); 
    } 
}​ 

левые комментарии, где изменения были сделаны

+0

Ваши объяснения хороши. Боюсь, ваше исправление не будет достаточным. –

0

Как уже отмечалось , строки "true" и "false" не работают так же, как логические значения true и false. Если вы попытаетесь использовать строку в операторе if или с логическим оператором, например &&, строка преобразуется в логическое; и все непустые строки преобразуются в true (то есть они являются «правдивыми»). Это означает, что строка "false" будет работать противоположно тому, как вы ожидаете, например. в ("false" && x) или в if ("false") {...}.

Один из способов исправить код, чтобы изменить эту строку

   canAssignMultiple = canAssignMultiple && canAssign; 

преобразовать canAssign в булево в явном и правильно:

   canAssignMultiple = canAssignMultiple && (canAssign == "true"); 

Тогда оператор && будет работать правильно, и canAssignMultiple будет содержать фактическое булево значение.

И (как отмечено @mdmullinax, но я хотел бы сделать это по-другому), как только canAssignMultiple на самом деле булево, вы можете изменить ваши if заявления рассматривать их как таковые:

if (canAssignMultiple == "false") 

должен стать

if (!canAssignMultiple) 

И аналогично с соответствующими данными withdraw.

0

Ваш HTML выглядит так?

<input canAssign="false" ...> 
<input canAssign="true" ...> 

Если это так, и вы не можете изменить HTML, я предлагаю это изменить:

canAssign = $(this).attr("canAssign").toLowerCase() 

к этому (для работы с булевыми с тех пор):

canAssign = $(this).attr("canAssign") == "true" 

и это:

if(canAssignMultiple == "false") 

к этому (поскольку это реальный булево сейчас):

if(canAssignMultiple) 

Если вы можете изменить HTML, я предлагаю вам сделать это HTML5-совместимый путь.Во-первых, все ваши атрибуты должны быть префиксом data-. Вы также можете сменить camelCase на дефис. JQuery, при загрузке ваших данных-атрибутов, будет затем perform the conversion из строки, если это возможно:

<input data-can-assign="false" ...> 
<input data-can-assign="true" ...> 

затем JQuery даст вам булево вы хотите от этого вызова:

canAssign = $(this).data("canAssign") 

Конечно, то же исправление должно применяться ко всем другим псевдо-логическим строкам строки (которые не совсем работают с булевыми операторами).

Причина: "false" не совсем false. "false" && x будет оцениваться до x (не до "false", как вы ожидаете). С другой стороны, false && x будет оцениваться до false.

Смежные вопросы