Сохранить предустановки dat.gui для динамически добавляемых элементов управления?

#javascript #json #dat.gui

#javascript #json #dat.gui

Вопрос:

Я динамически добавляю элементы управления в интерфейс dat.gui, но функция «сохранить настройки» их не распознает.

 var mygui = new dat.GUI();
mygui.remember(mygui);

// standard way of adding a control
mygui.control1 = 0.0;
var control = mygui.add(mygui, 'control1', -1, 1);

// adding controls dynamically
var myArray = ['control2', 'control3'];
var controls = [];
for (x in myArray) {
    controls[myArray[x]] = 0.0;
    var newControl = mygui.add(controls, myArray[x], -1, 1);
}
 

Все элементы управления работают должным образом, но когда я нажимаю значок шестеренки, JSON настроек содержит только первый элемент управления или любые другие элементы управления, которые я добавляю обычным способом:

 {
  "preset": "Default",
  "closed": false,
  "remembered": {
    "Default": {
      "0": {
        "control1": 0.5,
      }
    }
  },
  "folders": {}
}
 

Я предполагаю, что я как-то путаю функциональность remember (), есть идеи?

Ответ №1:

Строки в цикле for должны быть:

 mygui[myArray[x]] = 0.0;
var newControl = mygui2.add(mygui, myArray[x], -1, 1);
 

Первый параметр add функции выполняет две функции: он является как источником второго параметра (имя добавляемого элемента управления, которым в данном случае является myArray[x]), так и местом назначения. Вы можете хранить имена элементов управления где угодно, но если первый параметр не является gui, remember() функция не будет знать об элементах управления, и они не будут добавлены в атрибут gui __rememberedObjects или сохранены в объекте JSON.

Комментарии:

1. Блестящий ответ! Если кто-то действительно хочет , чтобы графический интерфейс не запоминал определенную настройку, он должен дополнительно настроить newControl.isModified = function() { return false; }; , чтобы он не показывал звездочку рядом с именем предустановки.