Ausgabe
Ich erstelle ein Skript, in dem ein Benutzer aus mehreren Dropdown-Listen auswählen muss, um sein Bild zu benennen. Da jede Zeile in der Benutzeroberfläche gleich ist und gleich funktioniert (sie enthält eine Dropdown-Liste, ein Auswahlfeld zum Bearbeiten der Liste, ein Textfeld zum Bearbeiten und Schaltflächen zum Hinzufügen/Bearbeiten/Entfernen), habe ich eine Funktion zum Hinzufügen erstellt diese ui-Elemente, anstatt sie einzeln aufzuschreiben. Diese Funktion befindet sich ebenfalls in einer separaten Datei. Alles funktioniert bis zu diesem Punkt. Was ich jetzt tun muss, ist, was auch immer der Benutzer in den Dropdown-Listen ausgewählt hat, und daraus einen Dateinamen zu erstellen. Ich kann jedoch nicht auf die Liste zugreifen. Ich denke, weil die Funktion das letzte Bit ist, das aufgerufen wird.
Ich habe eine Funktion erstellt, die den Dateinamen erstellt. Ich habe dann versucht, die Dropdown-Liste an verschiedenen Stellen und auf unterschiedliche Weise aufzurufen.
var dlg = new Window('dialog', 'Material to Library');
//Material category panel, used to select which material dialogue option appears
dlg.grp0 = dlg.add('group');
dlg.grp0.addCatPnl = dlg.grp0.add('panel', [10, 110, 705, 170], 'Assign a type of material');
panelOption(0, dlg.grp0.addCatPnl.matCatTitle, 'Material Category:', dlg.grp0.addCatPnl.matCat, dlg.grp0.addCatPnl.matCatAddBox, dlg.grp0.addCatPnl.matCatNew, dlg.grp0.addCatPnl.matCatEditText, dlg.grp0.addCatPnl.matCatAddButt, dlg.grp0.addCatPnl.matCatEdtButt, dlg.grp0.addCatPnl.matCatRmvButt, dlg.grp0.addCatPnl, 15, 40, false);
//2)Create a panel for the option
dlg.swap = dlg.add ('group');
dlg.swap.visible = true;
dlg.swap.orientation = 'stack';
//panel swaps in
dlg.swap.asgnPnlV = dlg.swap.add('panel', [10, 200, 705, 450], 'Assign material name');
dlg.swap.asgnPnlV.visible = false;
var ddlName = dlg.swap.asgnPnlV.veneerMfg;
panelOption(1, dlg.swap.asgnPnlV.veneerMfgTitle, 'Manufacturer:', dlg.swap.asgnPnlV.veneerMfg, dlg.swap.asgnPnlV.veneerMfgAddBox, dlg.swap.asgnPnlV.veneerMfgNew, dlg.swap.asgnPnlV.veneerMfgEditText, dlg.swap.asgnPnlV.veneerMfgAddButt, dlg.swap.asgnPnlV.veneerMfgEdtButt, dlg.swap.asgnPnlV.veneerMfgRmvButt, dlg.swap.asgnPnlV, 15, 40, true);
panelOption(1, dlg.swap.asgnPnlV.veneerSpeciesTitle, 'Species', dlg.swap.asgnPnlV.veneerSpecies, dlg.swap.asgnPnlV.veneerSpeciesAddBox, dlg.swap.asgnPnlV.veneerSpeciesNew, dlg.swap.asgnPnlV.veneerSpeciesEditText, dlg.swap.asgnPnlV.veneerSpeciesAddButt, dlg.swap.asgnPnlV.veneerSpeciesEdtButt, dlg.swap.asgnPnlV.veneerSpeciesRmvButt, dlg.swap.asgnPnlV, 50, 75, true);
panelOption(1, dlg.swap.asgnPnlV.veneerCutTitle, 'Cut', dlg.swap.asgnPnlV.veneerCut, dlg.swap.asgnPnlV.veneerCutsAddBox, dlg.swap.asgnPnlV.veneerCutNew, dlg.swap.asgnPnlV.veneerCutEditText, dlg.swap.asgnPnlV.veneerCutAddButt, dlg.swap.asgnPnlV.veneerCutEdtButt, dlg.swap.asgnPnlV.veneerCutRmvButt, dlg.swap.asgnPnlV, 85, 110, true);
panelOption(1, dlg.swap.asgnPnlV.veneerStainTitle, 'Stain', dlg.swap.asgnPnlV.veneerStain, dlg.swap.asgnPnlV.veneerStainAddBox, dlg.swap.asgnPnlV.veneerStainNew, dlg.swap.asgnPnlV.veneerStainEditText, dlg.swap.asgnPnlV.veneerStainAddButt, dlg.swap.asgnPnlV.veneerStainEdtButt, dlg.swap.asgnPnlV.veneerStainRmvButt, dlg.swap.asgnPnlV, 120, 145, false);
panelOption(1, dlg.swap.asgnPnlV.veneerMapTitle, 'Map', dlg.swap.asgnPnlV.veneerMap, dlg.swap.asgnPnlV.veneerMapAddBox, dlg.swap.asgnPnlV.veneerMapNew, dlg.swap.asgnPnlV.veneerMapEditText, dlg.swap.asgnPnlV.veneerMapAddButt, dlg.swap.asgnPnlV.veneerMapEdtButt, dlg.swap.asgnPnlV.veneerMapRmvButt, dlg.swap.asgnPnlV, 155, 180, false);
//This one works(below), but this is not what I want
//materialName(dlg.swap.asgnPnlV.veneerMatName, dlg.swap.asgnPnlV, 'sel1', 'sel2', 'sel3', 'sel4', 'sel5');
//This one (below) is what I actually want Error 21, undefined is not an object line 25....
materialName(dlg.swap.asgnPnlV.veneerMatName, dlg.swap.asgnPnlV, dlg.swap.asgnPnlV.veneerMfg.selection, dlg.swap.asgnPnlV.veneerSpecies.selection, dlg.swap.asgnPnlV.veneerCut.selection, dlg.swap.asgnPnlV.veneerStain.selection, dlg.swap.asgnPnlV.veneerMap.selection);
//Other panels to swap in
////
dlg.show();
////
function panelOption(panelPosition, title, titleText, name, nameAddbox, nameNew, nameEditText, nameAddButt, nameEdtButt, nameRmvButt, pnlNm, x1, x2, isUpperCase){
var listArray = ['test1', 'test2', 'test3', 'veneer'];
title = pnlNm.add('StaticText', [15, x1, 110, x2], titleText.toString());
name = pnlNm.add('DropDownList', [120, x1, 230, x2], listArray);
nameAddbox = pnlNm.add('checkbox', [240, x1, 260, x2], 'Edit List');
nameAddbox.value = false;
nameNew = pnlNm.add('StaticText', [330, x1, 360, x2], 'New:');
nameEditText = pnlNm.add('EditText', [360, x1, 480, x2],);
nameEditText.enabled = false;
nameAddButt = pnlNm.add('button', [490, x1, 545, x2], ' add ');
nameAddButt.enabled = false;
nameEdtButt = pnlNm.add('button', [555, x1, 610, x2], 'edit');
nameEdtButt.enabled = false;
nameRmvButt = pnlNm.add('button', [620, x1, 675, x2], 'remove');
nameRmvButt.enabled = false;
if (panelPosition == 0){
name.onChange = function(){
var x = name.selection;
switch (x.toString()){
case 'veneer':
dlg.swap.asgnPnlV.visible = true;
dlg.swap.asgnPnlSS.visible = false;
break;
default:
dlg.swap.asgnPnlV.visible = false;
}
}
}
}
function materialName(matName, pnlNm, nom1, nom2, nom3, nom4, nom5){
var temp = 'material name here build as it goes';
var nomenclature1 = nom1;
var nomenclature2 = nom2;
var nomenclature3 = nom3;
var nomenclature4 = nom4;
var nomenclature5 = nom5;
var temp = nomenclature1 + '_' + nomenclature2 + '_' + nomenclature3 + '_' + nomenclature4 + '_' + nomenclature5;
matName = pnlNm.add('StaticText', [15, 205, 310, 230], temp);
if (pnlNm.visible == true){
dlg.findElement ('veneerMfg').onChange = function() {
//var nomenclature1 = Nom1.selection;
//return nomenclature1;
alert ('found element');
}
}
}
Was ich brauche, ist, dass die name.selection einer der Werte in der Dropdown-Liste ist, die vom Benutzer ausgewählt wurde. Immer wenn ich das name.selection-Element aufrufe, das mit der Funktion erstellt wurde, ist es “undefiniert”. Ich habe dlg.findElement (‘veneerMfg’) ausprobiert, das hat mir ‘null’ gegeben, was meiner Meinung nach bedeutet, dass es das Element gefunden hat, aber ich muss in der Lage sein, es zu finden, wenn der Benutzer die Auswahl in der Dropdown-Box ändert.
Lösung
Ich denke, der einfachste Weg, auf die Dropdowns zuzugreifen, wäre über children
Ihr dlg.swap.asgnPnlV
Panel, etwa so:
var myButton = dlg.add('button',undefined,'Test');
myButton.onClick = function() {
var k = 1; // there're 40 children, each 8th is the dropdown, starting from index 1
var names = [];
for (var i = 0; i < dlg.swap.asgnPnlV.children.length; i++) {
// add only every 8th element
if ((i-k)%8 == 0) {
names.push(dlg.swap.asgnPnlV.children[i].selection)
}
}
alert(names);
}
Ihre Funktion würde also in etwa so aussehen:
materialName(dlg.swap.asgnPnlV.veneerMatName, dlg.swap.asgnPnlV, dlg.swap.asgnPnlV.children[1].selection, dlg.swap.asgnPnlV.children[9].selection, dlg.swap.asgnPnlV.children[17].selection, dlg.swap.asgnPnlV.children[25].selection, dlg.swap.asgnPnlV.children[33].selection);
Dies ist jedoch nicht sehr vielseitig. Noch besser wäre es, all diese Panels in einer Schleife hinzuzufügen, auf diese Weise ist es möglich, mein names
Objekt im Handumdrehen zu ändern, ohne nach allen Kindern zu fragen. Beachten Sie die Schließung, die ich verwendet habe, um sicherzustellen, dass sich alle Dropdowns richtig ändern names
.
var panelData = [
{
name: 'Manufacturer',
list: ['m1', 'm2', 'm3'],
coords: [15, 40]
},
{
name: 'Species',
list: ['s1', 's2'],
coords: [50, 75]
},
{
name: 'Cut',
list: ['cut1', 'cut2', 'cut3', 'cut4', 'cut5'],
coords: [85, 110]
},
{
name: 'Stain',
list: ['stain1', 'stain2', 'stain3', 'stain4'],
coords: [120, 145]
},
{
name: 'Map',
list: ['map1', 'map2', 'map3', 'map4', 'map5', 'map6'],
coords: [155, 180]
}];
var mygroup;
var names = {};
for (var i = 0; i < panelData.length; i++)
{
(function(item)
{
var mygroup = dlg.swap.asgnPnlV.add('group', [15, item.coords[0], 410, item.coords[1]]);
mygroup.add('statictext', [0, 0, 110, 20], item.name);
var myDropDown = mygroup.add('DropDownList', [110, 0, 230, 20], item.list);
myDropDown.onChange = function()
{
names[item.name] = String(this.selection)
}
})(panelData[i])
}
var myB = dlg.add('button', undefined, 'Test');
myB.onClick = function()
{
alert(JSON.stringify(names));
}
Ihre Funktion würde also so aussehen:
materialName(dlg.swap.asgnPnlV.veneerMatName, dlg.swap.asgnPnlV, names['Manufacturer'], names['Species'], names['Cut'], names['Stain'], names['Map']);
Beantwortet von – Sergey Kritskiy
Antwort geprüft von – Marilyn (FixError Volunteer)