1) Я работаю над приложением dat.GUI, в котором у меня есть 2 ползунка. Я хочу сбросить одно при изменении другого. Например :

 var FizzyText = function() {
   this.slider1 = 0;
   this.slider2 = 0;
};
var gui = new dat.GUI();
var text = new FizzyText();
var slider1 = gui.add(text, 'slider1', 0, 5);
var slider2 = gui.add(text, 'slider2', 0, 5);

slider1.onChange(function(value){
  console.log(value); 
  text.slider2 = 0; // this doesn't work
});

slider2.onChange(function(value){
  console.log(value);
  text.slider1 = 0; // this doesn't work
});

Это всего лишь пример, но очень важно, чтобы ползунок был сброшен или установлен на значение по умолчанию (в FizzyText).

Пример выше взят из https: //workshop.chromeexperiments .com / examples / gui / # 9 - Updating-the-Display-Automatically, где я не могу автоматически обновлять слайдер.

2) Хочу добавить кнопку сброса, при которой сбрасываются все ползунки. Но с предыдущим ответом я смогу сбросить все значения

4
Hearner 15 Дек 2016 в 03:29

2 ответа

Я нашел ответ: gui.__controllers - это массив контроллеров. Я просто добавил что-то вроде этого:

var FizzyText = function () {
    this.slider1 = 0;
    this.slider2 = 0;
};
var gui = new dat.GUI();
var text = new FizzyText();
var slider1 = gui.add(text, 'slider1', 0, 5);
var slider2 = gui.add(text, 'slider2', 0, 5);

/* Here is the update */
var resetSliders = function (name) {
    for (var i = 0; i < gui.__controllers.length; i++) {
        if (!gui.__controllers.property == name)
            gui.__controllers[i].setValue(0);
    }
};

slider1.onChange(function (value) {
    console.log(value);
    resetSliders('slider1');
});

slider2.onChange(function (value) {
    console.log(value);
    resetSliders('slider2');
});
2
Hearner 27 Авг 2019 в 19:14
Потому что он не прикрепил dat.gui к сниппету.
 – 
Mister SirCode
29 Окт 2019 в 14:55
В целом хороший ответ, спасибо вам ОЧЕНЬ за это, я искал это вечно, лол
 – 
Mister SirCode
29 Окт 2019 в 14:55

Лучше всего сбросить значения dat.GUI с помощью контроллера .initialValue вместо его жесткого кодирования, поэтому предпочтительнее использовать следующее: gui.__controllers[i].setValue(gui.__controllers[i]);

Вы можете сбросить все контроллеры графического интерфейса, используя gui.__controllers.forEach(controller => controller.setValue(controller.initialValue));

1
Zach Saucier 14 Мар 2019 в 03:07
Или если у него есть папки: for (const f in gui.__folders) {gui.__folders[f].__controllers.forEach(c => c.setValue(c.initialValue))}
 – 
e-motiv
11 Апр 2022 в 18:42