2013-03-23 85 views
0

我怎樣才能返回所選擇的複選框值從MooTools的類:mootools的組複選框返回值

MooTools的類:

var CheckboxGroup = new Class({ 

    Implements: Events, 

    initialize: function(master, slaves) { 
     this.master = $(master); 
     this.slaves = $$(slaves); 
     this.selected = [];    
     var that = this; 

     this.master.addEvent('click', this.onMasterClick.bind(this)); 
     this.slaves.addEvent('click', function() { 
      that.onSlaveClick(this); 
     }); 
    }, 

    onMasterClick: function() { 
     this.slaves.set('checked', this.master.get('checked')).fireEvent('change'); 
     this.fireEvent('masterClick'); 
     this.fireEvent('onCheckboxClick'); 
    }, 

    onSlaveClick: function(slave) { 
     this.master.set('checked', this.slaves.every(function(el) { return el.get('checked'); })); 
     this.fireEvent('slaveClick', slave); 
     this.fireEvent('onCheckboxClick'); 
    }, 

    onCheckboxClick: function() { 

    ??? how to return selected values 
    } 

}); 

HTML和腳本:

<div class="container"> 
    <label class="master"><input type="checkbox" id="master" /> Master</label> 
    <label><input type="checkbox" class="slave" value="1"/> Slave #1</label> 
    <label><input type="checkbox" class="slave" value="2"/> Slave #2</label> 
    <label><input type="checkbox" class="slave" value="3"/> Slave #3</label> 
    <label><input type="checkbox" class="slave" value="4"/> Slave #4</label> 
    <label><input type="checkbox" class="slave" value="5"/> Slave #5</label> 
</div> 
<script> 
     new CheckboxGroup('master', '.slave').addEvents({ 
     'onCheckboxClick': function() { 
      console.log(this.selected); /*EVERY TIME [] ?????*/ 
     } 
    }); 
</script> 

回答

1

你需要的是Selector: checked 由於它很容易從包含它們的容器中獲取checked元素,所以我通過將容器元素添加到構造函數中來更改類(在你的例子中,只需將id =「container」添加到容器中,但是你可以選擇如何以你的方式實現這一點 - 例如)。

一件事是,你不需要定義的「onCheckboxClick」在你的班級,因爲這是你被暴露你的API提高事件:http://jsfiddle.net/BqVtL/

var CheckboxGroup = new Class({ 

    Implements: Events, 

    initialize: function(container,master, slaves) { 
     this.container = document.id(container); 
     this.master = $(master); 
     this.slaves = $$(slaves); 
     this.selected = [];    
     var that = this; 

     this.master.addEvent('click', this.onMasterClick.bind(this)); 
     this.slaves.addEvent('click', function() { 
      that.onSlaveClick(this); 
     }); 
    }, 

    onMasterClick: function() { 
     this.slaves.set('checked', this.master.get('checked')).fireEvent('change'); 
     this.setSelected(); 
     this.fireEvent('masterClick'); 
     this.fireEvent('onCheckboxClick'); 
    }, 

    onSlaveClick: function(slave) { 
     this.master.set('checked', this.slaves.every(function(el) { return el.get('checked'); })); 
     this.setSelected(); 
     this.fireEvent('slaveClick', slave); 
     this.fireEvent('onCheckboxClick'); 
    }, 

    setSelected: function(){ 
     //you can loose the container mechanism and use $$('.slave:checked').get('value') 
    //  this.selected = this.container.getElements('.slave:checked').get('value'); 


      //Dimitar Christoff better solution: (then there is no need in container at all) 
      this.selected = this.slaves.filter(':checked').get('value'); 


    } 

}); 

new CheckboxGroup('container','master', '.slave').addEvents({ 
    'onCheckboxClick': function() { 
     console.log(this.selected); /*EVERY TIME [] ?????*/ 
    } 
}); 
+0

'this.slaves.filter()'會當他們被緩存時會更好。實際上,將它們存儲在內存中時,隨時通過onchange變量意味着整個'setSelected'方法可以被棄用。 'this.slaves.set('checked',this.master.get('checked'))。fireEvent('change');'連續兩次'.each',BAD - 可以用來存儲選定的值。並且通過dom元素做一個手動的'.fireEvent('change')'是毫無意義的。無論如何,@Adidi - 我知道這不是你的代碼,這是爲OP。 – 2013-03-24 00:05:58

+0

好評。我在這些方面同意你的觀點,我在他的課堂上親自看到了它,但我想他只是想了解mootools oop是如何工作的,所以在他的學習曲線期間,我不想把他的頭弄得太多......但謝謝 - 你的評論總是富有洞察力的:)) – Adidi 2013-03-24 00:11:26

+0

當然 - 很高興有人幫忙,而不是我現在。哦,是的,連續兩個'.each'在從屬設備上,併爲每個設備創建一個新的'master.get('checked');'而不是緩存不可變的值。我幾乎開發了強迫症 - 看到非優化的代碼讓我感到不舒服:) – 2013-03-24 00:24:25