Variablenschwund?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Variablenschwund?

    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.

    Quellcode

    1. function newProject() {
    2. this.categories = new Array; // Variable in der Werte gespeichert werden sollen
    3. this.newCategoryOption = newCategoryOption; // Funktion zur Einpflegung der Werte in this.categories.
    4. this.selectCategories = selectCategories; // Auslesung der Werte
    5. }
    6. function newCategoryOption(projectid, id, title) {
    7. var category = new Array(2);
    8. category["id"] = id;
    9. category["title"] = title;
    10. if (!this.categories[projectid])
    11. this.categories[projectid] = new Array();
    12. this.categories[projectid].push(category);
    13. }
    14. function selectCategories() {
    15. var selectedValue = document.getElementById("reference_view").selectProject.options[document.getElementById("reference_view").selectProject.selectedIndex].value;
    16. var showCategories = document.getElementById("displayCategory").style.display = "none";
    17. var parent = document.getElementById("selectCategory");
    18. var categories;
    19. if ( categories = this.categories[selectedValue]) // überprüfung ob ein array existiert?
    20. {
    21. //tudiesoderdas
    22. }
    23. }
    Alles anzeigen




    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 (

    Quellcode

    1. if ( categories = this.categories[selectedValue])
    ).


    Hilfe?
  • also in #4 hast du das array falsch initialisiert - da fehlen die klammern

    könnte schon der fehler sein, aber generell musst du erst überprüfen ob das objekt existiert, und danach kannst du prüfen ob der index existiert

    Quellcode

    1. if (this.category != null) {
    2. if(this.categories[selectedValue] == null) {


    ist das beabsichtigt, dass du in #27 eine zuweisung statt eines vergleichs machst?


    btw: assoziative arrays sind schon in ordnung:
    http://www.validome.org/doc/HTML_ge/javascript/objekte/array.htm#assoziative_arrays
  • 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 :

    Quellcode

    1. function newProject() {
    2. this.currentvalue = "selectProject";
    3. this.projects_id = new Array;
    4. this.projects_title = new Array;
    5. this.categories = new Array;
    6. this.switchField = switchField;
    7. this.newProjectOption = newProjectOption;
    8. this.newCategoryOption = newCategoryOption;
    9. this.selectCategories = selectCategories;
    10. this.selectType = selectType;
    11. this.displayBankform = displayBankform;
    12. this.type = new Array;
    13. this.type[1] = new Array("linktext", "titletag", "target", "max", "expired");
    14. this.type[2] = new Array("linktext", "titletag", "target", "max", "expired");
    15. this.type[3] = new Array("linktext", "titletag", "target", "max", "expired");
    16. this.type[4] = new Array("linktext", "titletag", "target", "max", "expired");
    17. this.type[5] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink");
    18. this.type[6] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink", "bankdata", "paymentmethod", "paymentpattern", "patternbegins");
    19. this.type[7] = new Array("linktext", "titletag", "target", "max", "expired", "myurl", "personaldata", "insertlink", "bankdata", "paymentmethod", "paymentpattern", "patternbegins");
    20. }
    Alles anzeigen


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

    Quellcode

    1. function switchField() {
    2. // parent
    3. var element = document.getElementById("switchProject");
    4. var oldField = document.getElementById(this.currentvalue);
    5. var oldRef = document.getElementById("switchRef");
    6. if ( this.currentvalue == "selectProject" )
    7. {
    8. // replaceWith
    9. var replaceField = document.createElement("input");
    10. replaceField.setAttribute("type", "text");
    11. replaceField.setAttribute("name", "newProject");
    12. replaceField.setAttribute("value", "Neues Projekt");
    13. replaceField.setAttribute("id", "newProject");
    14. oldRef.firstChild.data = "Zurück zur Auswahl?";
    15. }
    16. else if ( this.currentvalue == "newProject")
    17. {
    18. // replaceWith
    19. var replaceField = document.createElement("select");
    20. replaceField.setAttribute("name", "selectProject");
    21. replaceField.setAttribute("id", "selectProject");
    22. replaceField.setAttribute("onChange", "selectCategories()");
    23. // array durchlaufen
    24. for ( index in this.projects_id) {
    25. var newOption = document.createElement("option");
    26. newOption.appendChild(document.createTextNode( this.projects_title[index] ));
    27. newOption.setAttribute("value", this.projects_id[index] );
    28. replaceField.appendChild(newOption);
    29. }
    30. oldRef.firstChild.data = "Neues Projekt anlegen?";
    31. }
    32. // replace
    33. element.replaceChild(replaceField, oldField);
    34. if ( this.currentvalue == "selectProject")
    35. this.currentvalue = "newProject";
    36. else
    37. this.currentvalue = "selectProject";
    38. }
    39. function newCategoryOption(projectid, id, title) {
    40. category = new Array;
    41. category["title"] = title;
    42. category["id"] = id;
    43. if ( !this.categories[projectid])
    44. {
    45. this.categories[projectid] = new Array;
    46. }
    47. this.categories[projectid].push(category);
    48. }
    49. function selectCategories() {
    50. var selectedValue = document.getElementById("reference_view").selectProject.options[document.getElementById("reference_view").selectProject.selectedIndex].value;
    51. var project;
    52. document.getElementById("displayCategories").style.display = "none";
    53. if ( ( this.categories ) && ( selectedProject = this.categories[selectedValue]) )
    54. {
    55. var parent = document.getElementById("selectCategories");
    56. for ( index in parent.childNodes)
    57. {
    58. if ( (parent.childNodes[index].nodeName == "SELECT") || (parent.childNodes[index].nodeName == "OPTION") )
    59. parent.removeChild(parent.childNodes[index]);
    60. }
    61. document.getElementById("displayCategories").style.display = "";
    62. var selectBox = document.createElement("select");
    63. selectBox.setAttribute("name", "selectCategory");
    64. for ( category in selectedProject)
    65. {
    66. var newOption = document.createElement("option");
    67. newOption.appendChild(document.createTextNode( selectedProject[category]["title"] ));
    68. newOption.setAttribute("value", selectedProject[category]["title"] );
    69. selectBox.appendChild(newOption);
    70. }
    71. parent.appendChild(selectBox);
    72. }
    73. }
    Alles anzeigen



    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.


    Ich kann mir nicht vorstellen, dass es an #4 liegt, da es a) egal ist, ob ich die Klammern verwende, wenn ich keine Elemente mit übergebe und b) funktioniert alles, bis ich eben switchFields() ausführe.

    Gruß Lars