Variablenschwund

topf

Mitglied
Hallo, ich habe eine Klasse geschrieben, in der ein mehrdimensionales Array Daten beinhalten soll, die allerdings erst nach Objektanlage gefüllt werden.
Im Nachfolgenden stelle ich meine Ideen kurz vor,
ich bin leider nicht sonderlich profiliert was Javascript-Arbeit angeht, aber ich hoffe, man versteht meine Ideen.
HTML:
function newProject() {
	this.categories = new Array; // Variable in der Werte gespeichert werden sollen
	this.newCategoryOption = newCategoryOption;  // Funktion zur Einpflegung der Werte in this.categories.
	this.selectCategories = selectCategories; // Auslesung der Werte
}


function newCategoryOption(projectid, id, title) {
var category = new Array(2);
category["id"] = id;
category["title"] = title;

if (!this.categories[projectid])
this.categories[projectid] = new Array();

this.categories[projectid].push(category);

}

function selectCategories() {
	var selectedValue = document.getElementById("reference_view").selectProject.options[document.getElementById("reference_view").selectProject.selectedIndex].value;
	var showCategories = document.getElementById("displayCategory").style.display = "none";
	var parent = document.getElementById("selectCategory");
	var categories;
	if ( categories = this.categories[selectedValue]) // überprüfung ob ein array  existiert?
	{
                  //tudiesoderdas		
	}
}



So jetzt kommt mein Problem:

Das funktioniert alles super, bis zu einem Punkt:
Die select-Auswahl welche selectedValue übergibt kann per Knopfdruck in ein input-Feld umgebaut werden und dies funktioniert auch rückgängig.
Wieso bekomme ich bloß nach doppelter Umwandlung, also nach Umwandlung in ein input-field und zurück in die selectBox die Fehlermeldung:" Fehler: this.categories has no properties"
DIe Zeile ist (
HTML:
if ( categories = this.categories[selectedValue])
).


Hilfe?
 
ja, das wird in der html.datei angelegt.
und dann kommen die optionen ins array mit :
HTML:
var project = new newProject;
project.newCategoryOption(1, 2, "test");
project.newCategoryOption(21, 22, "test2");


Verstanden?
 
Wenn du einem Objekt eine neue Methode zufügen willst, gehe so vor:
Code:
function einObjekt()
{
 //irgendwas
}

einObjekt.prototype.Methode=function(param1,param2,etc)
{
  //mach was
}
 
Hmm, also die Methode geht schon, allerdings kommt da dieser Fehler.

Woran mag das bloß liegen? Ich mein, ich habe die Variable ja extern global deklariert.
 
Hmm, also die Methode geht schon

Bei mir kommt da ein Fehler a'la "Objekt unterstützt Methode nicht".

Zum Vergleich, das Ganze mal etwas abgespeckt...um zu sehen, wo die Variablen bleiben...

deine Variante:
Code:
<script type="text/javascript">
<!--
function newProject() {
	this.var_ = 'bla';
        this.selectCategories();
}


function newCategoryOption(x) {

this.var_=x;

}

function selectCategories() {
  alert(this.var_);
}
var project = new newProject;
project.newCategoryOption('blubb');
project.selectCategories();
//-->
</script>

...mein Vorschlag:
Code:
<script type="text/javascript">
<!--
function newProject() {
	this.var_ = 'bla';
	this.selectCategories();
}


newProject.prototype.newCategoryOption=function(x) {
this.var_=x;
}

newProject.prototype.selectCategories=function() {
  alert(this.var_);
}

var project = new newProject;
project.newCategoryOption('blubb');
project.selectCategories();
//-->
</script>

...probiere es mal aus :)
 
Der gesamte Code der Klasse sind mittlerweile 130 Zeilen und ich kann mir nicht vorstellen, dass es keine Zumutung ist, sich das reinzuziehen, zumal ich kein geübter Programmierer bin in Sachen javascript.

Aber ich kann es gerne posten, eine HTML ausgabe gibt es eigentlich nur dahingehend, wie oben erwähnt. Sprich über eine Funktion werden Werte einem Array übergeben.

Ich kann versuchen mein Problem nochmals zu definieren :

Ein Objekt mit folgenden Methoden und Variablen wird über folgende Klasse angelegt :
HTML:
function newProject() {
	this.currentvalue = "selectProject";
	this.projects_id = new Array;
	this.projects_title = new Array;
	this.categories = new Array;

	this.switchField = switchField;
	this.newProjectOption = newProjectOption; 
	this.newCategoryOption = newCategoryOption; 
	this.selectCategories = selectCategories; 
	this.selectType = selectType;
	this.displayBankform = displayBankform;
	
	this.type = new Array;
	this.type[1] = new Array("linktext", "titletag", "target", "max", "expired"); 
	this.type[2] = new Array("linktext", "titletag", "target", "max", "expired"); 
	this.type[3] = new Array("linktext", "titletag", "target", "max", "expired"); 
	this.type[4] = new Array("linktext", "titletag", "target", "max", "expired"); 
	this.type[5] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink"); 
	this.type[6] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink", "bankdata", "paymentmethod", "paymentpattern", "patternbegins"); 
	this.type[7] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink", "bankdata", "paymentmethod", "paymentpattern", "patternbegins"); 
}

Die relevanten Funktionen, die ich zur Problembehebung einschließe sind folgende:

HTML:
function switchField() {
        // parent
        var element = document.getElementById("switchProject");
       
        var oldField = document.getElementById(this.currentvalue);
        var oldRef = document.getElementById("switchRef");
        if ( this.currentvalue == "selectProject" )
        {
			// replaceWith
			var replaceField = document.createElement("input");
			replaceField.setAttribute("type", "text");
			replaceField.setAttribute("name", "newProject");
			replaceField.setAttribute("value", "Neues Projekt");
			replaceField.setAttribute("id", "newProject");
		   
			oldRef.firstChild.data = "Zurück zur Auswahl?";
        }
        else if ( this.currentvalue == "newProject")
        {
			// replaceWith
			var replaceField = document.createElement("select");
			replaceField.setAttribute("name", "selectProject");
			replaceField.setAttribute("id", "selectProject");
			replaceField.setAttribute("onChange", "selectCategories()");
			
			// array durchlaufen 
			for ( index in this.projects_id) {
					var newOption = document.createElement("option");
					newOption.appendChild(document.createTextNode( this.projects_title[index] ));
					newOption.setAttribute("value", this.projects_id[index] );
					replaceField.appendChild(newOption);
			}
			
			oldRef.firstChild.data = "Neues Projekt anlegen?";
       }

        // replace
        element.replaceChild(replaceField, oldField);
        if ( this.currentvalue == "selectProject")
            this.currentvalue = "newProject";
        else
            this.currentvalue = "selectProject";
}

function newCategoryOption(projectid, id, title) {
	category = new Array;
	category["title"] = title;
	category["id"] = id;
	
	if ( !this.categories[projectid])
	{
		this.categories[projectid] = new Array;
	}	
	this.categories[projectid].push(category);
}

function selectCategories() {
	var selectedValue = document.getElementById("reference_view").selectProject.options[document.getElementById("reference_view").selectProject.selectedIndex].value;
	var project;
	document.getElementById("displayCategories").style.display = "none";
	
	if ( ( this.categories ) && ( selectedProject = this.categories[selectedValue]) )
	{
		var parent = document.getElementById("selectCategories");
		
		for ( index in parent.childNodes)
		{
			if ( (parent.childNodes[index].nodeName == "SELECT") || (parent.childNodes[index].nodeName == "OPTION") )
				parent.removeChild(parent.childNodes[index]);
		}
		
		document.getElementById("displayCategories").style.display = "";

		var selectBox = document.createElement("select");
		selectBox.setAttribute("name", "selectCategory");
		
		for ( category in selectedProject) 
		{
			var newOption = document.createElement("option");
			newOption.appendChild(document.createTextNode( selectedProject[category]["title"] ));
			newOption.setAttribute("value", selectedProject[category]["title"] );
			selectBox.appendChild(newOption);
		}
		
		parent.appendChild(selectBox);
	}
	
}


Kurz :

Sobald ich die Funktion switchFields ausgeführt habe, ist die Variable this.categories leer und nichts lässt sich für eine Liste daraus entnehmen.

Vielleicht hilft das Zeug.

Gruß Lars
 
Zuletzt bearbeitet:
Sobald ich die Funktion switchFields ausgeführt habe....

...und wo/wie rufst du diese Funktion aus?
Und die von mir vorgeschlagene Änderung ist in deinem Code auch nicht drinnen.

Ohne den gesamten Code(komplettes Dokument) zu sehen, lässt sich da kaum helfen...kannst ihn ja als Datei ranhängen ;)
 
Zurück