2017-04-08 1 views
2

Ok, also ich bin neu in Ember, also ertragen Sie mit mir.Wie schreibt Ember Data über Instanzen von gespeicherten Modelldaten

Ich habe eine Ember-Anwendung, die mit einer API kommuniziert, die nicht JSONAPI-Standards entspricht, also habe ich begonnen, meine eigenen Serialisierer zu schreiben, um Ember-Daten zu verwenden. Ich stelle jedoch fest, dass die Daten beim Schreiben mehrerer Anfragen an dieselbe Ressource Probleme beim Schreiben in den Speicher haben. Aufeinanderfolgende Anfragen an die gleiche Ressource reagiert immer mit dem folgenden Fehler:

Typeerror: Objekt kann nicht auf Grundwert

Welche von meinem begrenzten Verständnis impliziert wandeln, dass die Daten, die ich in den Laden sende ist wie eine Schnur behandelt werden. für die listing-

model: function() { 
    return this.store.findAll('listing-item'); 
}, 

In einer verschachtelten 'user' Route, wenn ich jede Art von Anfrage zu tun:

in meiner Anwendung Route Ich habe ein findAll zu meinem Modell 'Listing-Artikel' wie so geschrieben Positionsdaten, die eine Array Antwort (Abfrage, findAll) für die listing-Positionsdaten liefern, die ich erhalte:

TypeError: Cannot convert object to primitive value 

at EmptyObject.SETTER_FUNCTION [as title] (ember.debug.js:20672) 
at assign (<anonymous>) 
at InternalModel.setupData (internal-model.js:244) 
at Class._load (store.js:1728) 
at Class._pushInternalModel (store.js:2055) 
at Class._push (store.js:1995) 
at finders.js:141 
at Backburner.run (ember.debug.js:720) 
at Class._adapterRun (store.js:2253) 
at finders.js:139 

(Titel ist ein Feld in meinem Auflistung Element-Modell).

Wie ich bereits erwähnt, meine API haftet nicht an JSONAPI Standards, also habe ich eine Auflistung-Artikel Serializer wie so geschrieben:

import DS from 'ember-data'; 

export default DS.RESTSerializer.extend({ 

    normalizeArrayResponse(store, primaryModelClass, payload) { 

    payload.data = []; 
    payload.listing_item._data.forEach(this.formatListingItemArray, payload.data); 
    delete payload.listing_item; 

    return payload; 
    }, 

    formatListingItemArray(listingItem) { 
    this.push({ 
     type: "listing-item", 
     id: listingItem.id, 
     attributes: { 
     title: listingItem.title, 
     description: listingItem.description, 
     buy_now_price: listingItem.buy_now_price, 
     created_at: listingItem.created_at, 
     category_id: listingItem.category_id, 
     subcategory_id: listingItem.subcategory_id, 
     identity_id: listingItem.identity_id, 
     listing_number: listingItem.listing_number, 
     brand_new: listingItem.brand_new, 
     sold: listingItem.sold, 
     }, 
    }); 
    }, 

}); 

So nehme ich meine Frage ist, was ist Ember Daten tun mit meinem Datenobjekt für diesen Fehler auftreten, und was könnte ich falsch machen beim Formatieren meiner Daten für Ember-Daten zu konsumieren.

UPDATES:

Es scheint, als ob nur die oberen 3 Felder diesen Fehler verursachen. Wenn ich die Attribute 'title', 'description' und 'buy_now_price' in meinem Serializer auskommentiere, bekomme ich diesen Fehler nicht. Es scheint auch, dass dies nur auftritt, wenn ich zur Route navigiere. Wenn ich beim Laden der Anwendung in der Benutzerroute bin, funktionieren beide Anfragen wie erwartet.

Ok, also habe ich durch ember-data code gecrawlt und festgestellt, dass es in der internal-model.js-Datei eine Setup-Funktion gibt, die die aktuellen Attribute im Speicher überprüft und sie mit den übergebenen Daten vergleicht aus dem Serializer. Dann wird assign() verwendet, um die neuen Daten des Serializers in das Speicherobjekt zu kopieren. Aus irgendeinem Grund scheint es, dass mein Stores-Objekt eine Reihe von "Getter" - und "Setter" -Funktionen hat, die aus dem Speicher für die problematischen Felder (Titel, Beschreibung und buy_now_price) zurückkommen. Was ich jetzt wissen muss ist, warum diese Funktionen für die Fahrt kommen und was habe ich getan, um dies zu verursachen?

Picture of getters/setters on ember-data object

Vielen Dank im Voraus, lassen Sie mich wissen, wenn es mehr Informationen, die ich, um zu schaffen, muß eine besseren Kontext zu geben.

Antwort

0

So fand ich die Lösung für mein Problem für jeden, der ein ähnliches Problem erlebt.

Das Symptom war wie oben erwähnt, es schien, als ob ember-Daten Getter- und Setter-Funktionen aus dem Laden zurückbringen und Probleme haben, meine neuen Werte an ihre Stelle zu setzen.Allerdings war der Hinweis, dass nur die Felder in meiner Vorlage gerendert wurden.

Das Problem scheint zu sein, dass ich eine Ember Concurrency-Aufgabe verwendet habe, um das Laden meiner Daten durchzuführen, und dann die Aufgabe direkt von der Modellvorlage an eine interne Komponente weiterleitet. Etwas ähnliches (nicht getesteter Code):

Das falsche Muster (eins, das ich benutzte, um das Problem zu erfahren).

//route file - application.js 
export default Ember.Route.extend({ 

    model: function() { 
    return { 
     listings: this.get('getListings').perform(), 
    }; 
    },  

    getListings: task(function *() { 
    return yield this.store.findAll('listing-item'); 
    }), 

}) 


//application template - application.hbs 
{{listing-index listings=model.listings}} 


//listing index component template.hbs 
{{#if listings.value}} 
    {{#each listings.value.content as |listing|}} 
    {{listing._data.title}} 
    {{listing._data.description}} 
    {{listing._data.buy_now_price}} 
    {{/each}} 
{{/if}} 

das richtige Muster scheint so zu sein:

//route file - application.js 

export default Ember.Route.extend({ 

    model: function() { 
    return { 
     listings: this.get('getListings').perform(), 
    }; 
    },  

    getListings: task(function *() { 
    return yield this.store.findAll('listing-item'); 
    }), 

}) 


//application template - application.hbs 
{{#if listings.value}} 
    {{listing-index listings=model.listings.value}} 
{{/if}} 


//listing index component template.hbs 
{{#each listings as |listing|}} 
    {{listing.title}} 
    {{listing.description}} 
    {{listing.buy_now_price}} 
{{/each}} 

So das Problem scheint die Aufgabe vorbei, anstatt der Inhalt der Aufgabe in meine Komponente in diesem Muster zu liegen. Als ich die Listings in der Modellvorlage überschlug und dann die Listings direkt an die Komponente übergab, schien es meine Probleme gelöst zu haben. Ich nehme an, dass dies etwas mit der Verwendung dieser _data-Eigenschaften zu tun hat. Eine weitere Erklärung wäre willkommen, aber ich werde dies jetzt als gelöst markieren.

Verwandte Themen