我有以下 RequireJS 模块,我用它来使用 AmCharts 构建图表。 (为了简洁起见,我删除了一些代码)。
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":[]}}
我通过注释掉其他所有内容,将错误追溯到该行。那行不正确的是什么?
最佳答案
在此通话中:
stats.init('{{ data|raw }}', '{{ "graphs.axes.filesize"|trans({}, "admin") }}');
您传递一个字符串作为第一个参数。然后 $.each
尝试在此字符串中查找 "length"
:"length"in a
(其中 a
code> 被初始化为与传递给 stats.init
的第一个参数相同的值。
如果 {{ data|raw }}
是格式正确的 JavaScript 对象或 JSON,则可以删除引号。但是,我担心您如何在代码中将 rawData
复制到 originalData
。如果您只是删除引号并获取 JavaScript 对象,请注意,如果您在后面的代码中修改 originalData
,那么 rawData
也会有相同的修改 因为你没有克隆它。因此,如果您想将其与 originalData
的更改隔离开来,则必须克隆它。 (克隆的方法有很多种,哪种方法最适合您的情况取决于您的问题中没有的详细信息。)
另一种可能性是按原样保留对 stats.init
的调用,但在函数内部执行以下操作:
var originalData = JSON.parse(rawData)
这假设 {{ data|raw }}
的 JSON 格式正确。
关于javascript - 类型错误 : invalid 'in' operand a error when calling jQuery each inside RequireJS module,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39630716/