4

こんにちは、このチェック ボックスに問題があります。

<input type="checkbox" id="hideTempSeries" checked="checked" value="0" /> 
     Temperature <br />
<input type="checkbox" id="hideFlowSeries" checked="checked" value="1" /> 
     Flow <br />
<input type="checkbox" id="hidePressSeries" checked="checked" value="2"/> 
     Pressure <br /> 
<input type="checkbox" id="hideCondSeries" checked="checked" value="3" /> 
     Conductivity  <br />

removePanes(checkedArray) .. この jQuery 関数は、このチェック ボックスの値の配列を"チェック ボックスのいずれかが変更されるたびに"という関数に送信します 。

   $("#tools :checkbox").change(function(){
       if($(this).prop('checked')){// when Checked

       }
       else{// when unChecked
       var checkedArray = [] ; 
        $("#tools :checkbox").each(function(index,value){
           if($(this).prop('checked') == false){checkedArray.push($(this).val())}

        });
        removePanes(checkedArray) ;
       }

removePanes() 関数

   function removePanes(id){
       var removeUncheckedSeries = $.map(newSeries , function(index,value){
        for(var i=0 ; i < id.length ; i++){  
            if(index.yAxis == id[i])return null;
        }  
       return index ;
       });
       var modified = $.map(removeUncheckedSeries, function(index,value) {
        index.yAxis = 15 ; 
        return index ;
       });
      console.log(modified) ;
    } ; 

これは newSeries[] オブジェクトです

次に、removePanes(checkedArray) 関数はこの配列を取得し、未チェックの値に相当するすべてのオブジェクトを : newSeries[]objectから削除します。

次に、すべての yAxis 値を 15 に設定します。

この機能は動作していません。

チェックボックスが変更されるたびに、関数は newSeries[] オブジェクトをリロードしないため、最後の変更でそれを変更するだけです。

それが行うことは、最初のクリックが正常に機能し、すべての yAxis が 15 に設定されることです。すべての yAxis が 15 に等しく、jQuery 配列が 0 から 3 までの値を送信するため、他のボックスのチェックを外すと、何も起こりませんでした。

質問:チェック ボックスの変更がトリガーされるたびremovePanes(checkedArray)にオブジェクトをリロードするにはどうすればよいですか?newSeries[]

4

1 に答える 1

3

これは、オブジェクトがデフォルトで Javascript の参照によってコピーされるためです。

したがって、コピーされたオブジェクトのプロパティをどこからでも変更すると、他のすべてに影響します。値のみ(またはクローン)でオブジェクトをコピーするには、$.extend()Jonh Resig(はい、彼自身)がここに示したようなjQueryのメソッドを使用できますhttps://stackoverflow.com/a/122704/344304

var newObj = $.extend(true, {}, oldObj); // deep copy

したがって、removePanes次のように関数を変更します

function removePanes(id) {
        var seriesCopy = jQuery.extend(true, {}, newSeries);
        var removeUncheckedSeries = $.map(seriesCopy, function(obj, index) {
            return   $.inArray(obj.yAxis,id) == -1 ? obj : null;
        });
        var modified = $.map(removeUncheckedSeries, function(obj, index) {
            obj.yAxis = 15;
            return obj;
        });
        console.log(modified);
    };​

デモ: http://jsfiddle.net/joycse06/w2KS2/

于 2012-06-19T14:59:56.657 に答える