2017-12-05 19 views
0

Ich versuche, eine App für Smarthome-Geräte mit Glut zu bauen. Ich habe Mirage bereits installiert und deklariere ein Array, das Daten heißt. Es enthält Arrays wie Haushalte, Benutzer und Geräte. Jetzt bin ich mit gefilterten Daten aus dem Laden stecken und ich bin wirklich verwirrt durch das Verhalten des Ladens. Aus diesem Grund lese ich schon einige gleiche Themen wie diese Filtering store data in ember, aber das funktioniert nicht in meinem Fall.Ember gefilterte Daten aus dem Laden/Mirage

Eigentlich ist das meine router.js

Router.map(function() { 
    this.route('about'); 
    this.route('users', function() { 
    }); 
    this.route('households', function() { 
    this.route('index', { path: '/:user_id' }) 
    this.route('rooms',{ path: '/:household_id' }); 
    this.route('devices'); 
    }); 
}); 

Wenn ich households.index werde ich alle Haushalte sehen wollen, die den Benutzer-ID in seinem Element-Array. Der folgende Codeausschnitt zeigt ein Beispiel für meine Datenstruktur.

"users": [ 
     { 
      "id":101, 
      "forename":"Peter", 
      "surname":"Peterson", 
      "memberIn":[ 
       501 
      ] 
     }, 
     { 
      "id":102, 
      "forename":"Anna", 
      "surname":"Peterson", 
      "memberIn":[ 
       501 
      ] 
     } 
] 

    "households":[ 
     { 
      "id":501, 
      "name":"Zuhause", 
      "admin":131000, 
      "member":[ 
       101, 
       102 
      ] 
} 

Ich rufe die Strecke household.index wie diese {{# link-to "households.index" user.id}} und meine Route in household.index sieht wie folgt aus

model(params) { 
    //holt alle Haushalte und gibt dann nur die Haushalte weiter, die auch den aktuellen Benutzer als Member haben. 
    return this.get('store').findAll('household').then(results => results.filter((site) => { 
     return site.get('member').filter(x => x == params.user_id).length > 0; 
    })); 
    } 

Und meine config.js Teil bei mirage wie folgt:

this.get('/households', function(db, request) { 
    return { households: data.households }; 
}); 

Dies funktioniert gut! Aber meiner Meinung nach ist der Server dafür verantwortlich, mir die Daten zu geben, nach denen ich suche. Alles, was ich will, ist, dass ich eine spezifische Anfrage sende und nur die Haushalte bekomme, die ich brauche.

Mein Versuch: index.js:

export default Route.extend({ 
    model(params) { 
     return this.get('store').find('household', params.user_id); 
     } 
}); 

Config js Teil:

this.get('/households/:id', function(db, request) { 
     console.log('household get'); 
     console.log(data.households.filter(x => x.member.filter(x => x == request.params.id).length > 0)); 
    return { households: data.households.filter(x => x.member.filter(x => x == request.params.id).length > 0) }; 
}); 

Debug Fehler:

Error while processing route: households.index payload.data is null

Ich kann nicht verstehen, warum dieser Fehler auftritt. Das Protokoll gibt mir das Array, das ich zurückgeben möchte.

Antwort

0

sicher, dass Sie RestSerializer in mirage verwenden,

// mirage/serializers/application.js 
import { RestSerializer } from 'ember-cli-mirage'; 

export default RestSerializer; 

und für das richtige Format beziehen sich RESTAdapterAPI.

Nur sind sicher, dass Sie Daten in das unten stehende Format zurückkehrt,

für die einzige Antwort,

{ 
    "posts": { 
    "id": 1, 
    "title": "I'm Running to Reform the W3C's Tag", 
    "author": "Yehuda Katz" 
    } 
} 

und für mehr als ein,

{ 
    "posts": [ 
    { 
     "id": 1, 
     "title": "I'm Running to Reform the W3C's Tag", 
     "author": "Yehuda Katz" 
    }, 
    { 
     "id": 2, 
     "title": "Rails is omakase", 
     "author": "D2H" 
    } 
    ] 
} 
0

Standardmäßig wird Ember Data mit der JSONAPISerializer ausgeliefert und dies setzt ein paar Dinge über die Art und Weise voraus, wie Ihr Server (in diesem Fall Mirage) Daten formatiert. In diesem Fall wird erwartet, dass das Dokument, das die Luftspiegelung zurückgibt, im Allgemeinen der JSON API Spec entspricht und ein Element der obersten Ebene data enthält, in dem sich die primären Daten der Antwort befinden.

Wenn Sie sich an Ihre benutzerdefinierten Antworten halten möchten, sollten Sie sich die JSONSerializer von Ember Data ansehen. Andernfalls sollte die folgende Rückkehr erhalten Sie näher:

return { data: db.households.filter(x => x.member.filter(x => x == request.params.id).length > 0) }; 

oder könnten Sie nutzen die JSONAPISerializer, die Schiffe mit Mirage

mehr hier sehen Ember Guides | Serializers

+0

Dank für Ihre Hilfe danken. Ich vergesse zu sagen, dass ich den Restadapter benutze. – panx36

Verwandte Themen