2016-10-22 4 views
3

説明変更されたときに更新されません:

を2変数があります。dat.GUIが、私は問題のオブジェクト

controller1 = {i: 100}; 
controller2 = {i: 300}; 

control変数

control = controller1; 

私はDATを添付.GUIからcontrol.iへ。

gui = new dat.GUI(); 
controller = gui.add(control, "i"); 
controller.listen(); 

だから、controller1.iの値を表示し、私はdat.GUIで値を変更すると、それはcontroller1.iの値を変更します。私はdat.GUIの値を変更すると

control = controller2; 

が、私はそれがcontroller2.iを変更したいのですが、今ではcontroller1.iを変更します。

はその後、私が実行されます。ここで

はペンです:http://codepen.io/kranzy/pen/QKzYAW

またはスタックスニペット:

controller1 = {i: 100}; 
 
controller2 = {i: 300}; 
 
control = controller1; 
 
click.addEventListener("click", function() { 
 
    control = control == controller1 ? controller2:controller1; 
 
}); 
 
gui = new dat.GUI(); 
 
controller = gui.add(control, "i"); 
 
controller.listen(); 
 
setInterval(function(){ 
 
    current.textContent = JSON.stringify(control); 
 
    x.textContent = JSON.stringify(controller1); 
 
    y.textContent = JSON.stringify(controller2); 
 
},1000/24)
<script src="https://cdnjs.cloudflare.com/ajax/libs/dat-gui/0.6.1/dat.gui.min.js"></script> 
 
<h1>Controller 1: <code id="x"></code></h1> 
 
<h1>Controller 2: <code id="y"></code></h1> 
 
<button id="click"><h1>Change controller</h1></button> 
 
<h1>Value of current controller: <code id="current"></code></h1>

私が見ることができる唯一の方法は、コントローラを削除して、もう一度それを初期化されるたび私は変数controlを変更しますが、私は別の方法を知りたいと思います。
その方法はここに示唆されています:Refreshing dat.gui variable(本当に私の質問と同じではありませんが、関連しています)。
dat.GUIについての情報が不明な場合は、hereのツアーに参加してください。

答えて

1

私はそれは地獄のように簡単だ...愚かだった:

click.addEventListener("click", function() { 
    control = control == controller1 ? controller2:controller1; 
    controller.object = control; 
    // change the internal reference in dat.GUI 
}); 

私はdat.GUI対象物を検査した後にその方法を見つけました。

テストケース:http://codepen.io/anon/pen/aBvvmV

+0

なぜ恩恵を受けたのですか?それを取り戻すことはできますか?私の答えはあなたの問題を解決しません。 –

+0

@SanDroidは私のコメントを読んでいます。もし私があなたに恩恵を与えないなら、賞金はゴミに行きます。 –

0

問題がcontroller = gui.add(control, "i")を呼び出すことによって、あなたはcontrolオブジェクト(現在controller1)の参照を渡しているとdat.guiは、この参照の内部コピーを作成することです。したがって、ClickEventListener内のcontrolを上書きすると、dat.guiはまだcontroller1への参照を保持し、dat.guiのすべての変更はcontroller1になります。以前に追加されたコントローラを削除して新しいコントローラを渡す以外は、dat.guiの渡されたリファレンスをリセットする可能性はありませんでした。

+0

私はすでに知っています。 'dat.GUI'は内部参照を保持します。そして、私が望むのは、以前に追加されたコントローラを削除せずにdat.guiの渡された参照をリセットし、新しいものを渡す可能性を見つけることです。しかし、この質問に答えてくれてありがとう。この質問に答える人がいなければならないし、賞金はゴミ箱に行くだろう。 –

関連する問題