2016-09-22 3 views
0

У меня есть следующий модуль RequireJS, который я использую для построения диаграммы с помощью AmCharts. (Я сократил код для краткости).TypeError: неверный 'in' операнд ошибка при вызове jQuery каждый внутри модуля RequireJS

define('admin/stats', ['jquery', 'amcharts.serial'], function($, AmCharts) { 

    var historicalStats = { 

     init: function(rawData, axesMarker) { 

      var originalData = rawData, 
      charts = $('#charts'); 

      console.log(originalData); 

      $.each(originalData, function(graphName, config) { 
       // ...call a function in here... 
      }); 

     } 

    }; 

    return historicalStats; 

}); 

Это, как я называю это:

<script type="text/javascript"> 

    require(['admin/stats'], function(stats) { 
     stats.init('{{ data|raw }}', '{{ "graphs.axes.filesize"|trans({}, "admin") }}'); 
    }); 

</script> 

Проблема у меня есть это линия $.each(originalData, function(graphName, config) { ошибки со следующим:

TypeError: invalid 'in' operand a
...w:this,function(a,b){function c(a){var b="length"in a&&a.length,c=_.type(a);retu...

(я использую grunt для Минимизировать JavaScript).

originalData выглядит следующим образом:

{"users":{"series":[{"field":"users","title":"Users"}],"type":"raw","axesMarker":"Users","data":[]},"fileusage":{"type":"filesize","axesMarker":"File size","series":[],"data":[]},"dbsize":{"series":[{"field":"dbsize","title":"Database size"}],"type":"filesize","axesMarker":"File size","data":[]}}

Я проследил ошибку назад к этой отдельной строке закомментировав все остальное. Что это за неправильная строка?

ответ

1

В этом вызове:

stats.init('{{ data|raw }}', '{{ "graphs.axes.filesize"|trans({}, "admin") }}'); 

передать строку в качестве первого аргумента. А потом $.each пытается искать "length" в этой строке: "length" in a (где a инициализируется с тем же значением, как первый аргумент, переданный stats.init

Если {{ data|raw }} это правильно отформатированный объект JavaScript или JSON можно опустить кавычки.. Тем не менее, меня беспокоит то, как вы копируете rawData в originalData в свой код. Если вы просто удалите кавычки и получите объект JavaScript, знайте, что если вы измените originalData в своем более позднем коде, тогда rawData также будет иметь те же изменения, потому что вы не клонируете его. Поэтому, если вы хотите изолировать его от изменений до originalData, вам придется клонировать его. повторно много способов клонировать, который является лучшим в вашем случае зависит от деталей, которые не в вашем вопросе)

Другая возможность оставить вызов stats.init как есть, но внутри функции сделать:.

var originalData = JSON.parse(rawData) 

Это предполагает, что {{ data|raw }} правильно отформатирован JSON.

+0

Выброс '' 'around' '{{data | raw}}'' был решением. Спасибо. – crmpicco

Смежные вопросы