Abstract.TimedObserver.onTimerEventメソッド改修検討

前述したように、Form.Element.Observerでは、multiple指定のselectタグが扱えません。根本的な原因は、継承するAbstract.TimedObserverクラスのonTimerEventメソッドで、直前の値と現在の値の比較に、単純に不等号を用いていることです。改修案として、「直前の値と現在の値の比較時、値が配列の場合は、内容が同一かをチェックするロジック」を追加したものを提示します。

【改修案】Abstract.TimedObserver.onTimerEventメソッド
  onTimerEvent: function() {
    var isChanged = false;
    var value = this.getValue();
    if (this.lastValue instanceof Array
    &&  value instanceof Array){
      if(this.lastValue.length != value.length
      || this.lastValue.any(function(last, i){return (last != value[i]);})){
        isChanged = true;
      }
    }else{
      if (this.lastValue != value) {
        isChanged = true;
      }
    }
    if(isChanged){
      this.callback(this.element, value);
      this.lastValue = value;
    }
  }

これでselect-multipleも扱えるようになります。また、Form.Element.Observer.getValueメソッドで使用しているForm.Element.getValueメソッドを、前述Form.Element.getValueメソッドで提示した改修案の追加メソッドForm.Element.getValue2に置き換えることもできると思います。そうすると、複数の同一名要素も監視できるようになります。