2017-02-05 5 views
0

私はGreensockアニメーションライブラリで働いていますし、シーケンシャルアニメーション(一つのことはすぐに終了し、次の始まる場所)あなたはこのようにそれを入力する必要が構築するとき:配列をループする際にeval()を避けるには?

childTL.to($box, 1, {x:50,y:0}) 
     .to($box, 1, {x:50,y:50}) 
     .to($box, 1, {x:-50,y:50}) 
     .to($box, 1, {x:-50,y:0}); 

を私が持っている問題は、私はということですすべてのものをデータベースや変数として格納し、forループを使って段階的に物を構築する必要があります。

私は何をしたいです。このような何か:私はそれを()はevalを行い、その後一緒に文字列を連結してそれを行うと可能性を知っているが、なしでそれを行う方法がある

var animation = { 
    "name": "movearound", 
    "sequence": [{ 
    "duration": "1", 
    "vars": { 
     "x": "50", 
     "y": "0" 
    } 
    }, { 
    "duration": "1", 
    "vars": { 
     "x": "50", 
     "y": "0" 
    } 
    }, { 
    "duration": "1", 
    "vars": { 
     "x": "50", 
     "y": "0" 
    } 
    }, { 
    "duration": "1", 
    "vars": { 
     "x": "50", 
     "y": "0" 
    } 
    }] 
} 
target = $(".target123") 
childTL = new TimelineLite{onUpdate: updateSlider}); 

for (S = 0; S < animatelayers.sequence.length; S++) { 
    duration = animatelayers.sequence[S]["duration"]; 
    sequence = animatelayers.sequence[S]["vars"]; 
    if (S == 0) { 

    childTL.to(target, duration, sequence) 
    } else { 
    .to(".target", duration, sequence); 
    } 
} 

?私はevalを話しています理由について

編集():

私は私が持っている悩みを推測では、それがオブジェクト対文字列として入ってくる事になるとGreensockがどのようにうるさいです - たとえば、あなたはで$("#target")を使用することができます.to()を使用することはできますが、変数として最初に定義する場合は使用できません。var target = $("#target");、次にchildTL.to(target, 1, {x:50,y:0})は失敗しますが、var target = "#target"とするとうまくいきます。だから、過去に私はGreensockが文字列として欲しいのと全く同じように作成し、eval()を使用しました。私はそれを続けることができますが、私は物事を達成するためのより良い方法を探すことを好む。

+2

それはあなたの問題が何であるかは全く明らかではありません。 'eval()'のように見せたくないものは何でしょうか? – Pointy

+0

あなたがなぜ 'eval()'を使う必要があるのか​​、また文字列連結を使う必要があると思うのはあなたの質問からは分かりません。おそらく、あなたが望んでいるオブジェクトに変換する必要があるデータを最初に表示していれば? – Paul

+1

'target'は未使用です。 'animatelayers'、' duration'、 'sequence'とは何ですか? 'childTL [S]'とは何ですか? – melpomene

答えて

1

あなたのサンプルコードでは、意味がありませんので、代わりに私は、データ構造とループを使用するように、元のスニペットを変換する方法を実証するつもりです:

childTL.to($box, 1, {x:50,y:0}) 
     .to($box, 1, {x:50,y:50}) 
     .to($box, 1, {x:-50,y:50}) 
     .to($box, 1, {x:-50,y:0}); 

まず私たちは私たちのデータを定義します。

var coords = [ 
    {x: 50, y: 0}, 
    {x: 50, y:50}, 
    {x:-50, y:50}, 
    {x:-50, y: 0} 
]; 

その後、我々ループ:

var obj = childTL; 
for (var i = 0; i < coords.length; i++) { 
    obj = obj.to($box, 1, coords[i]); 
} 

これは、元の厳格な変換であるをチェーンが呼び出されます。しかし、このようなことは実際には必要ではありません。 .toメソッドは、便宜上オブジェクトを返すだけです(https://greensock.com/docs/#/HTML5/Animation/TimelineLite/to/による)。それを使用する必要はありません。

あなたは、単に言うことができます:

for (var i = 0; i < coords.length; i++) { 
    childTL.to($box, 1, coords[i]); 
} 
+1

論理からデータを分離するための+1。 'forEach'ループを使わないのはなぜですか?それはより洗練されたものであり、突然変異はなく、トレースを残さない( 'i'変数) – goldylucks

+0

@goldylucks' .forEach'にはいくつかの欠点があります:構文はsuper clunkyです(少なくとも '=>'はありません)。実際のループではありません( 'break'や' continue'を使うことはできません)。私が最後に見たとき、それは 'のために'より遅かった。デバッグ/ステップスルーをするのはもっと面倒です。 – melpomene

+0

'continue'は' return'と似ています。それは実際にはない "休憩"は、これは(少なくとも私の経験から)使用されていない場合の大多数のthoです。文法については、私は別の人々のために別のストロークを推測する;)それは、コミュニティが 'forEach'と' map'に向かって古いforループを見ているように見えるからです。 – goldylucks

関連する問題