2012-01-10 11 views
0

これはハイチャートのAPIのラッパーとしての私のプラグインの終わりです。私はextend()の内部にeach()のプロパティを設定して、現在のオブジェクトidの属性にchart.renderToを設定しています。

これは機能しません。 console.log($(this).attr('id'))の出力は正しいですが、console.log(opt.chartOptions)は最後のID(chart2)のみをchart.renderToというプロパティとして表示します。

$.extend() jQuery機能について不明ですか?

var chartOptions = {}; // Plain option object 

    return this.each(function() { // Each div 

     console.log($(this).attr('id')); // Output: "chart1", "chart2" 
     $.extend(opt.chartOptions, { chart : {renderTo : $(this).attr('id') } }); 
     console.log(opt.chartOptions); // Ops! chart.renderTo is always "chart2" 

     $.ajax({ 
      url : opt.url, 
      type : 'POST', 
      data : opt.data, 
      dataType : 'json', 
      success : function(data) { 
       $.extend(data, opt.chartOptions); // Merge data from server 
       new Highcharts.Chart(data); 
      } 
     }); 

    }); 

答えて

0

私はopt.chartOptionsは、あなたのプラグイン機能でローカルスコープの変数であることを仮定しています。それが本当であれば、あなたがここでやっていることは、ラッパーコンテキストでdivのそれぞれに対してopt.chartOptionsを拡張しようとしています。

延長を繰り返すたびに(例:$.extend(foo,bar))、jQueryはfooの文字列をbarに拡張します。あなたはそれを知っていると確信しています。

おそらく、あなたのケースでは、barは常にフォーム{ chart : {} }のオブジェクトです。短いストーリー、.each()のすべての反復は、前の$.extend()呼び出しを上書きしています。最初の反復を通じて

opts.chartOptionsはあなたの.each()コンテキストで最初divから計算されるopts.chartOptions.chart、で拡張されます。

opts.chartOptionsをもう一度opts.chartOptions.chart,に広げようとしていますが、すでにです。しかし、jQueryは気にしないので、最初のdivの値にopts.chartOptions.chartの2番目のdivの計算値を割り当てます。

など、など。

あなたがここにそれを使用している方法で、それ通常はあなたのAJAXのコールバック関数にopts.chartOptionsの値を使用しているので、それがここにない、重要ではありませ必要がありますが。これはクロージャopts.chartOptionsに作成します。これは、AJAXのコールバックが発生するまでに、その値が期待どおりでないことを意味します(.each()、blah blahの別の反復で変更された可能性があるため)。

WHEW !!