2016-03-30 14 views
0

Ich beginne Redux jetzt zu studieren. Ich habe das Beispiel aus dem echten Wort als Ausgangspunkt verwendet, indem ich normalizr verwendet habe und erneut auswähle, um mit Daten umzugehen.Wie/wo Daten vom Server in einer Redux-App konvertieren?

Jetzt muss ich verstehen, wo ist der beste Ort, um Daten aus dem Server in js Date Objekte konvertieren. Da sich "normalizr" bereits um "einige Schemas" kümmert, dachte ich, dass es das auch könnte, aber ich habe es dort nicht gefunden.

Wohin soll ich diese Daten konvertieren? Meine Annahme ist, dass ich diese Daten, die bereits im Laden umgesetzt wurden, behalten muss. Ist das richtig?

+1

Sie müssen nicht, Sie können die Konvertierung in Ihre Präsentationskomponenten auch tun, wenn Sie möchten. – bryanph

+0

Sicher. Aber das würde die Ansichtsebene und das Serverformat "koppeln". Ich denke, dass es eine bessere Vorgehensweise ist, es so schnell wie möglich zu konvertieren, so dass die Ansicht weiter funktioniert, wenn ich den Server später ändere. Es scheint mir, dass dies eine Verantwortung einer "unteren" Schicht ist. Ich werde meine Lösung als Antwort einfügen. –

Antwort

0

Ich habe einen dritten Parameter callApi (innen api Middleware):

function callApi(endpoint, schema, conversionFromServer) { 
    const fullUrl = (endpoint.indexOf(API_ROOT) === -1) ? API_ROOT + endpoint : endpoint 
    return fetch(fullUrl) 
     .then(response => 
      response.json().then(json => ({ json, response })) 
     ).then(({ json, response }) => { 
      if (!response.ok) { 
       return Promise.reject(json) 
      } 
      const camelizedJson = camelizeKeys(json) 
      const nextPageUrl = getNextPageUrl(response) 
      let convJson = camelizedJson; 
      if(conversionFromServer) { 
       convJson = conversionFromServer(convJson); 
      } 
      return Object.assign({}, 
       normalize(convJson, schema), 
       { nextPageUrl } 
      ) 
     }) 
} 

und jetzt kann ich es so nennen:

return { 
    [CALL_API]: { 
     types: [ TIMESLOTS_REQUEST, TIMESLOTS_SUCCESS, TIMESLOTS_FAILURE ], 
     endpoint: `conference/${conferenceId}/timeslots`, 
     schema: Schemas.TIMESLOT_ARRAY, 
     conversionFromServer: (data) => { 
      data.timeslots.forEach((t)=>{ 
       t.startTime=php2js.date(t.startTime) 
       t.endTime=php2js.date(t.endTime) 
      }); 
      return data; 
     } 
    } 
} 

So kann ich diese Umwandlung zu halten „so nah der Server "wie ich kann.