私は下のコードのようなcoffeescriptでいくつかの反応コードを持っています。 _fetchKitesDoneはAJAXを介してデータを正しく取得しますが、レンダリングは常に「データの読み込み中...」と表示されて終了します。setStateが正しく起動していないと判断し、反応にバインドしていないコンポーネントの "this"スコープです。これにバインドするにはどうすればいいですか?このcoffeescriptのReactでsetStateを正しく呼び出せますか?
以下のコードではどうすればよいですか?それが問題でないなら、それは何ですか?
@ChartContainer = React.createClass
# Display name used for debugging
displayName: "ChartContainer"
# set initial state before mounting component
getInitialState: ->
#some state
fetchedData: false
kitesData: []
componentDidMount: ->
# fetch the data
@_fetchKites({})
_fetchKites: (data) ->
$.ajax
url: "/kites.json"
dataType: 'json'
data: data
.done @_fetchKitesDone
.fail @_fetchDealsFail
# If the AJAX call is successful ...
_fetchKitesDone: (data, textStatus, jqXHR) ->
# Change component state & cause children to render again
labels = []
kiteValues = []
for key of data
labels.push(key)
kiteValues.push(data[key])
stringData = {
labels: labels,
datasets: [
{
fillColor : "rgba(220,220,220,0.5)",
strokeColor : "rgba(220,220,220,1)",
pointColor : "rgba(220,220,220,1)",
pointStrokeColor : "#fff",
data : kiteValues
}
]
}
@setState
fetchedData: true
kitesData: stringData
# If errors in AJAX call ...
_fetchDealsFail: (xhr, status, err) =>
console.error @props.url, status, err.toString()
render: ->
if (@state.kitesData.length > 0)
<div>
in here
</div>
else
<div>Loading data...</div>
機能が正しくバインドされています。現状のままにしておきます。問題は 'stringData'が配列ではなくオブジェクトであることです。あなたのレンダリングコードでは常に '{} .length'が返されます。これはいつもundefinedを返します –