2014-04-16 138 views
13

对,我可能在这里很明显缺少这个,但我得到一个'Uncaught TypeError:undefined不是函数'我似乎是.map()这是这个问题,但我不明白为什么。.map()undefined不是函数React.js

var idealist = React.createClass({ 
loadCommentsFromServer: function() { 
    $.ajax({ 
     url: this.props.url, 
     dataType: 'json', 
     success: function(data) { 
      this.setState({data: data}); 
     }.bind(this) 
    }); 
}, 
handleButtonClick: function(input) { 
    // do stuff // 
}, 
getInitialState: function() { 
    return {data: []}; 
}, 
componentWillMount: function() { 
    this.loadCommentsFromServer(); 
    setInterval(this.loadCommentsFromServer, this.props.pollInterval); 
}, 
render: function() { 
    var clickFunction = this.handleButtonClick; 
    var ideas = this.state.data.map(function(i){ 
     return <ideabox data={i} onButtonClick={clickFunction} />; 
    }); 
    return (
     <div className="idealist"> 
      {ideas} 
     </div> 
     ); 
} 
}); 

React.renderComponent(
<idealist url="/json/quotes.php" pollInterval={2000}/>, 
document.getElementById('quoteList') 
); 

如果我将其更改为 VAR想法= this.state.data 我没有得到任何错误,JSON数据格式正确,还有什么能错了吗?

+0

你确定this.state.data是一个数组吗? – Hatsjoem

+0

['map'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map)是JavaScript的Array上的一个函数;它没有被React定义。确保'this.state.data'是一个数组。 –

+0

这就是为什么我很困惑,状态,据我所知必须是一个数组和state.data定义在getInitialState中:function(){ return {data:[]}; }。 state.data由loadCommentsFromServer更新。有问题的脚本返回格式正确的JSON数据 – t1m0thy

回答

15

这是一个愚蠢的错误,quotes.php没有返回格式正确的JSON数据,所以它不是一个数组.map()被调用。学到的教训是?不要把别人的话说成是他们的代码工作!

5

.map()是一种用提供的结果创建新数组的方法。

下面是该文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/map

,你可以在这里做的是改变对象的.data属性返回数组中的事情。由于.map()仅适用于数组类型对象。

+0

实际上,'map'可以用于任何像对象一样的数组,但是你需要通过'.call'或'.apply'或者duck类型来明确地设置'this'的值。 –