2017-06-14 5 views
0

Ich versuche, eine Suchfunktion zu implementieren, in der ein Benutzer andere Benutzer zurückgeben kann, indem ein Benutzername durch eine Komponente übergibt. Ich folgte den Ember Führer und habe den folgenden Code so in meinen Routen zu tun, Datei:Zurückgeben eines Datensatzes mit einer Zeichenfolge in

import Ember from 'ember'; 

export default Ember.Route.extend({ 
    flashMessages: Ember.inject.service(), 
    actions: { 
    searchAccount (params) { 
     // let accounts = this.get('store').peekAll('account'); 
     // let account = accounts.filterBy('user_name', params.userName); 
     // console.log(account); 

     this.get('store').peekAll('account') 
     .then((accounts) => { 
     return accounts.filterBy('user_name', params.userName); 
     }) 
     .then((account) => { 
     console.log(account); 
     this.get('flashMessages') 
     .success('account retrieved'); 
     }) 
     .catch(() => { 
     this.get('flashMessages') 
     .danger('There was a problem. Please try again.'); 
     }); 
    } 
    } 
}); 

Dieser Code jedoch wirft mir die folgenden Fehler:

"You cannot pass '[object Object]' as id to the store's find method"

denke ich, dass diese Implementierung der .find Methode ist nicht mehr gültig, und ich muss das Objekt auf andere Weise zurückgeben. Wie würde ich das machen?

+1

Sie sagten, Sie folgten Ember Guides, aber wo hat es erwähnt, die Methode find zu verwenden. 'find' ist eine private Methode, also benutze das nicht. – kumkanillam

Antwort

1

Sie können .then für filterBy nicht tun.

Sie können .then für peekAll nicht tun. weil beide das Versprechen nicht erwidern.

Aufruf von asynchronen Code und innerhalb der searchAccount und die Rückgabe des Ergebnisses macht hier nicht viel Sinn. seit searchAccount wird schnell vor Abschluss des asynchronen Codes zurückkehren.

this.get('store').findAll('account',{reload:true}).then((accounts) =>{ 
if(accounts.findBy('user_name', params.userName)){ 
    // show exists message 
} else { 
    //show does not exist message 
} 
}); 

Der obige Code wird den Server kontaktieren, und alle Ergebnisse erhalten und dann findBy für die Filterung tun. Die Filterung erfolgt also auf der Client-Seite. statt dessen können Sie Abfragen durchführen,

this.store.query('account', { filter: { user_name: params.userName } }).then(accounts =>{ 
//you can check with length accounts.length>0 
//or you accounts.get('firstObject').get('user_name') === params.userName 
//show success message appropriately. 
}); 
+1

Ihre erste Implementierung funktionierte für mich, so dass ich das Konto, nach dem ich gesucht hatte, abrufen und seine Eigenschaften abfragen konnte. Vielen Dank! – d00medman

1

DS.Store # find ist keine gültige Methode in modernen Versionen von Ember Data. Wenn die Benutzer bereits im Geschäft sind, können Sie spähen und filtern sie:

this.store.peekAll('account').filterBy('user_name', params.userName); 

Andernfalls müssen Sie den gleichen Ansatz verwenden Sie in Ihrer früheren Frage verwendet, und query sie (vorausgesetzt, Ihr Backend unterstützt Filterung):

this.store.query('account', { filter: { user_name: params.userName } }); 
+0

Ich habe versucht, diesen Code zu implementieren, aber es bricht und wirft einen Fehler beim Lesen von 'TypeError: this.get (...). PeekAll (...). Ist dann keine Funktion bei Class.searchAccount'. Ich kann die beiden aufteilen, aber das Ausführen von filterBy kann keine Daten abfangen. Was verursacht diese Fehler, und wie kann ich sie beheben? – d00medman

+0

@ d00medman Ah, duh, 'peekAll' gibt kein Versprechen ab. Ich werde meine Beispiellösung reparieren. – mwp

Verwandte Themen