Sono nuovo per reagire e il flusso e sto avendo difficoltà a cercare di capire come caricare i dati da un server. Sono in grado di caricare gli stessi dati da un file locale senza problemi.Come creare chiamate API in REACT e FLUX
Quindi, prima fino ho questo View Controller (Controller-view.js) che passa verso il basso stato iniziale ad una visione (view.js)
controllore 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;
ho un file azioni che carica il dati INITAL per la mia app. Quindi si tratta di dati che è non chiamato da come azione dell'utente, ma chiamato da getInitialState in vista del regolatore
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;
E poi il mio API dati assomiglia a questo
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;
e questo è il negozio 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;
Così come ho già detto in precedenza, quando carico i dati in locale utilizzando BillApi.getBillLocal() in azioni tutto funziona bene. Ma quando cambio a BillApi.getBillServer() ottengo gli errori followind nella console ...
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
Ho anche aggiunto un console.log (dati) per BillApi.getBillServer() e posso vedere che il i dati vengono restituiti dal server. Ma viene visualizzato DOPO Ottengo gli avvisi nella console che credo possa essere il problema. Qualcuno può offrire qualche consiglio o aiutarmi a risolverlo? Ci scusiamo per un post così lungo.
UPDATE
ho fatto alcune modifiche al file api.js (controllare qui per il cambiamento e DOM errori plnkr.co/edit/HoXszori3HUAwUOHzPLG), come è stato suggerito che il problema è dovuto a come gestire la promessa. Ma sembra ancora essere lo stesso problema che puoi vedere negli errori DOM.
Cosa stai passando th' subscriptionsList'? Sta cercando 'this.props.subscriptions' ed è inesistente quindi si ottiene' Can not read property 'period' of undefined'. La mia ipotesi è che tu abbia anche qualche tipo di condizione di gara. Il flusso è asincrono per sua natura ... –
Ho pensato che forse era per quello che stavo ottenendo l'errore 'non posso leggere' - a causa delle condizioni della gara. I dati forse non erano ancora stati caricati? Qualche consiglio su come risolverlo? –
Sì, puoi usare il metodo di callback come suggerito da ultralame o puoi dare a '_bill' un oggetto predefinito come' var _bill = {subscriptions: []} 'così quando fai' getInitialState' ottieni il 'bill' tramite 'store.getAllBill()'. quindi quando il componente viene montato, i dati vengono recuperati e lo store emetterà la modifica e aggiornerà il tuo stato –