Я новичок в реагировании и потоке, и мне трудно найти способы загрузить данные с сервера. Я могу загрузить те же данные из локального файла без проблем.
Итак, у меня есть этот вид контроллера (controller-view.js), который передает начальное состояние в view (view.js)
Контроллер-view.js
var viewBill = React.createClass({
getInitialState: function(){
return {
bill: BillStore.getAllBill()
};
},
render: function(){
return (
<div>
<SubscriptionDetails subscription={this.state.bill.statement} />
</div>
);
}
});
module.exports = viewBill;
view.js
var subscriptionsList = React.createClass({
propTypes: {
subscription: React.PropTypes.array.isRequired
},
render: function(){
return (
<div >
<h1>Statement</h1>
From: {this.props.subscription.period.from} - To {this.props.subscription.period.to} <br />
Due: {this.props.subscription.due}<br />
Issued:{this.props.subscription.generated}
</div>
);
}
});
module.exports = subscriptionsList;
У меня есть файл действий, который загружает данные INITAL для моего приложения. Таким образом, это данные, которые не вызваны как действие пользователя, но вызваны из getInitialState в представлении контроллера
InitialActions.js
var InitialiseActions = {
initApp: function(){
Dispatcher.dispatch({
actionType: ActionTypes.INITIALISE,
initialData: {
bill: BillApi.getBillLocal() // I switch to getBillServer for date from server
}
});
}
};
module.exports = InitialiseActions;
И тогда мой API данных выглядит так:
api.js
var BillApi = {
getBillLocal: function() {
return billed;
},
getBillServer: function() {
return $.getJSON('https://theurl.com/stuff.json').then(function(data) {
return data;
});
}
};
module.exports = BillApi;
И это магазин store.js
var _bill = [];
var BillStore = assign({}, EventEmitter.prototype, {
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
},
removeChangeListener: function(callback) {
this.removeListener(CHANGE_EVENT, callback);
},
emitChange: function() {
this.emit(CHANGE_EVENT);
},
getAllBill: function() {
return _bill;
}
});
Dispatcher.register(function(action){
switch(action.actionType){
case ActionTypes.INITIALISE:
_bill = action.initialData.bill;
BillStore.emitChange();
break;
default:
// do nothing
}
});
module.exports = BillStore;
Так, как я упоминал ранее, когда я загружаю данные локально с помощью BillApi.getBillLocal(), в действиях все работает нормально. Но когда я перехожу к BillApi.getBillServer(), я получаю следующие ошибки в консоли...
Warning: Failed propType: Required prop `subscription` was not specified in `subscriptionsList`. Check the render method of `viewBill`.
Uncaught TypeError: Cannot read property 'period' of undefined
Я также добавил console.log(данные) в BillApi.getBillServer(), и я вижу, что данные возвращаются с сервера. Но он отображается ПОСЛЕ. Я получаю предупреждения в консоли, которые, я считаю, могут быть проблемой. Может ли кто-нибудь предложить какие-либо советы или помочь мне исправить это? Извините за такой длинный пост.
UPDATE
Я внесла некоторые изменения в файл api.js(здесь вы можете найти изменения и ошибки DOM plnkr.co/edit/HoXszori3HUAwUOHzPLG), поскольку было высказано предположение, что проблема связана с тем, как я выполняю обещание. Но это все еще похоже на ту же проблему, что и в ошибках DOM.