2012-06-19 42 views
4
複製對象

你好,我有這個複選框的問題:如何通過價值的使用jQuery

<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 /> 

..這jQuery函數發送該複選框值的數組到一個名爲 功能removePanes(checkedArray) 「每一任的複選框時可能已經改變」

$("#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[] Object

removePanes(checkedArray)函數然後藉此陣列和從刪除所有等同於未選中的值的對象:newSeries[]對象

然後,它設置所有Y軸的值等於15。

此功能不起作用。

因爲每次更改複選框,函數都不會重新加載newSeries []對象,它只是在最後一次更改時修改它。

它的功能是,第一次點擊工作正常,然後它將所有yAxis設置爲15.當我取消選中任何其他框時,因爲所有yAxis等於15,jQuery數組發送值從0到3沒有任何發生。

問題:我怎樣才能使removePanes(checkedArray)重裝與newSeries[]對象每次上覆選框,觸發器的變化?

+0

'newSeries'對象在哪裏。你能證明嗎? –

+0

肯定給第二個 –

+0

在[jsfiddle](http://fiddle.jshell.net/)中的簡化演示將有所幫助,不是很清楚問題是什麼 – charlietfl

回答

3

發生這種情況的原因是,默認情況下,對象在JavaScript中通過引用 複製。

因此,如果您從任何地方更改複製對象的任何屬性,將會影響所有其他屬性。要通過值只(或克隆),你可以使用jQuery的$.extend()方法類似Jonh Resig的複製對象(是他自己)顯示這裏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/

+0

另一個想法是在頁面加載中使用$ .extend將簡單數據存儲到副本,然後在複選框未選中時使用$ .extend更新'newseries'。 – charlietfl

+0

@charlietfl,是的,也可以做到,我只是和他的組織一起去了。 –

+0

+1解決方案,我也在想它,只是把我的概念扔在 – charlietfl