Entw.: Picker

Verwendung von Picker

Alle Eingaben bei Smartphone's und Tablet-PC's, ob nun normale Texteingaben, Zahleneingaben, Datumseingaben oder Auswahlentscheidungen, finden i.d.R. standardmässig im unteren Teil des Touch-Bildschirms statt. Deshalb existieren bei Smartphone's und Tablet-PC's statt DropDown-Listen sogenannte Picker. Mit Hilfe dieser Picker sind die Auswahlentscheidungen vorzunehmen. Hier wird nun eine allgemeine Implementierung eines Pickers mit einem Slot vorgestellt.

Genauso wie bei den DatePicker'n gilt, wird mit Sencha Touch gearbeitet, so kann der Einbau eines Picker's nach den Vorgaben des Framework's erfolgen. Bei der Migration von Excel liegt das Layout der Applikation als HTML-Code vor, sodass eine andere Art der Implementieren zweckmässig ist. Ziel ist es den Picker-Einbau automatisiert vornehmen zu können.

Normale Auswahlentscheidung mit einer DropDown-ListeDropDown-Liste

Eine Auswahlentscheidung kann normal mit einer DropDown-Liste vorgenommen werden. Die Auswahl erfolgt direkt in der Maske.


Picker 1Picker

Das linke Bild zeigt den Picker im Einsatz. Die Auswahl erfolgt im unteren Bereich des Touch-Bildschirms.


Picker 2Picker

Auch dieses Bild zeigt einem Picker im Einsatz. Beide Picker sind Instanzen der gleichen JavaScript-Klasse.


HTML-Code

Folgender Code zeigt die Einbettung des Picker's in der HTML-Datei.

<div class='picker'>
  <span>
    <input  class='innerOutputText' name="prf02_1_4_5" id="prf02_1_4_5" type="text" readonly="readonly" >
    <button class='selectArrowDown' name="arrowDownBtn" onclick="onShowPicker(this);" tabindex="1" />
  </span>
</div>

Implementierung des Picker's in JavaScript

Die Klassenimplementierung des Picker's zeigt folgender Code in JavaScript.

Select1Picker = Ext.extend(Object, {
    htmlRefObj : {},
    constructor: function(config) {
        Ext.apply(this, config || {});
        if (this.name == undefined) {
            throw "Es muss ein Name angegeben werden (name)!";
        }
        if (this.urlStore == undefined) {
            throw "Es muss eine URL fuer den Store angegeben werden (urlStore)!";
        }
        if (this.keyName == undefined) {
            throw "Es muss der Name des Key-Feldes angegeben werden (keyName)!";
        }
        if (this.modelFields == undefined) {
            throw "Es fehlt die Modelfelder (modelFields)!";
        }
        if (this.fieldsMap == undefined) {
            throw "Es fehlt das Mapping (fieldsMap)!";
        }
        if (this.onOwnChangeFn == undefined) {
            throw "Es fehlt die individuelle Change-Funktion !";
        }
        this.model = Ext.regModel(this.name, {
               fields: this.modelFields
        });
        this.storeProfil = new Ext.data.Store({
           model: this.model,
           proxy: {
              type: 'ajax',
              url: this.urlStore
          }
        });
	    this.storeProfil.load();
	    this.selectPicker = new Ext.Picker({
	       slots: [ {
	          align       : 'center',
	          name        : 'Choice',
	          valueField  : this.keyName,
	          displayField: this.keyName,
	          value       : '',
	          store       : this.storeProfil
	       } ],
	       listeners: {
	         change: this.onPickerChange,
	         scope: this
	       }
	     });
        },
	setValues : function() {
	   var i, tmpMapObj, tmpFrom, tmpTo, tmpVal;
	   var iVal = this.htmlRefObj.value;
 	   var tmpIdx = this.storeProfil.findExact(this.keyName, iVal);
	   if (tmpIdx < 0) {
		  tmpIdx = this.storeProfil.find(this.valueField, iVal);
	   }
	   if (tmpIdx >= 0) {
	   	  var tmpItem = this.storeProfil.data.items[tmpIdx];
	      for (i = 0; i < this.fieldsMap.length; i++) {
	   		 tmpMapObj = this.fieldsMap[i];
			 tmpFrom = tmpMapObj.from;
  		 	 tmpTo = tmpMapObj.to;
			 if (tmpFrom != "") {
			 	tmpVal = tmpItem.data[tmpFrom];
			 }
			 else {
			    tmpVal = "";
			 }
			 document.getElementById(tmpTo).value = tmpVal;
	   	  }
	   }
	   else {
	      for (i = 0; i < this.fieldsMap.length; i++) {
		  	tmpMapObj = this.fieldsMap[i];
		  	tmpTo = tmpMapObj.to;
		  	document.getElementById(tmpTo).value = "";
		  }
	   }
	},
    onShowPicker : function(iObj) {
       var tmpParent = iObj.parentElement;
       var tmpFirstChild = tmpParent.firstElementChild;
       var tmpValStr = tmpFirstChild.value;
       this.htmlRefObj = tmpFirstChild; 
       this.selectPicker.show();
    },
    onPickerChange : function(iPicker, iValue) {
       var iVal = iValue.Choice;
       this.htmlRefObj.value = iVal;
       this.setValues();
       this.onOwnChangeFn(this.htmlRefObj, iVal);
    }
});