0

私のプロジェクトには次のことが必要です:

  • グローバル変数に値を設定する
  • 次に、このグローバル変数を使用する外部 JavaScript をロードします
  • 次に、変数を変更し、同じ JavaScript を再度ロードしますが、外部 JavaScript は次のようになります (Google Blockly を使用):

    Blockly.Blocks[block_name+'_autogetter_state'] = {
        init: function() {
            this.setName(block_name);
        }
    };
    

グローバル変数はblock_nameです。そこに変数を渡すので、変数のみが渡され、その値は渡されないようです。したがって、javascript を 2 回呼び出して HTML にロードすると、両方のブロックが同じように見えます。

おそらくJavaScriptをロードする方法は重要ではないので、試しました:

$('#htmlElement').append('<script src="' + jsURL + '" type="text/javascript"><\/script>');

また、AJAXを介して、<script>タグ間のHTMLにロードします。

インポートされたコードは次のようになります。

<script> var block_name='';</script>
<div id="htmlElement">
      <script>
           block_name='A';
           Blockly.Blocks[block_name+'_autogetter_state'] = {
               init: function() {
                   this.setName(block_name);
               }
           };
           block_name='B';
           Blockly.Blocks[block_name+'_autogetter_state'] = {
               init: function() {
                   this.setName(block_name);
               }
           };
       </script>
</div>

最初のブロックの名前は B で、2 番目のブロックも同様ですが、最初のブロックは A で、2 番目のブロックは B でなければなりません。楽しい部分は、名前 A のブロックを使用すると機能するため、システムは名前 A のブロックを認識しますが、名前 B で表示します。

それらが非同期的にロードされている間に、メソッド .Blocks の背後にある関数が引き継ぎ、それを B として登録している間に、グローバル変数が A で半分埋められて B になる可能性もあります...

しかし、今では、インポートされたjavascriptにグローバル変数を渡すことに問題がないことを確認したいと思います...そして、私の創造性はこのケースですでにかなりなくなっているので、どんな提案にもオープンです...

4

1 に答える 1

1

配列とループを使用して、コードの重複を回避し、スケーラビリティを向上させることができます。

var block_names = ['A', 'B'];
block_names.forEach(function(block) {
  Blockly.Blocks[block + '_autogetter_state'] = {
     init: function() {
       this.setName(block);
     }
  };    
});

//編集: setName fn でブロックする block_name。

于 2016-03-25T18:51:40.067 に答える