2017-09-13 3 views
1

J'ai un petit problème en utilisant findAll dans mon composant. Cela concerne la valeur qu'il renvoie à la fin.Ember - findAll et promesses

users: Ember.computed(function() { 
return this.get('store').findAll('user'); 
}), 

Dans mon cas, je veux obtenir le nom du premier objet. Donc dans mon guidon:

users.firstObject.name 

'users' est une classe dans ce cas. Mais je suis en train de revenir directement le premier objet dans la propriété, comme celui-ci:

user: Ember.computed(function() { 
    return this.get('store').findAll('user') 
    .then(function(user){ 
     return user.get('firstObject'); 
    }); 
    }), 

Mais dans ce cas, dans mon guidon, user.name est non défini et l'utilisateur est une promesse. Il ya quelque chose que je ne peux pas comprendre avec des promesses, comment ils fonctionnent ... Quelqu'un peut-il m'aider à obtenir le bon utilisateur sans utiliser 'firstObject' sur mes utilisateurs? Merci d'avance!

+0

Les composants sont configurés par défaut pour ne pas être conscients des données en dehors de ce qui est transmis, alors que cela peut être accompli avec une importation de magasin. Vous devriez avoir cette findAll dans un routeur et le renvoyer à un modèle. Vous pouvez ensuite transmettre ce modèle dans le composant. À partir de ce point, il est vraiment très simple de résoudre les enregistrements promis en utilisant toArray() alors vous pouvez obtenir le premier dans le tableau. 'this.get ('model'). toArray() [0]' – BrandonW

Répondre

0

Le chemin le plus court pour résoudre votre problème est d'installer un addon ember-promise-helpers et l'appliquer dans votre modèle comme suit:

{{#if (await user)}} 
    {{get (await user) 'name'}} 
{{/if}} 

Cependant, autant que je sache, il est recommandé de ne pas utiliser les promesses que les valeurs des propriétés calculées, Bien que vous puissiez toujours le faire. ici, je recommanderais le documentation pour Ember.PromiseProxyMixin ainsi que de lire certains threads (bien que plus anciens) du forum (par exemple this one).

+0

Merci, je vais jeter un oeil! – Seybol

0

Je pense que le problème que vous rencontrez n'est pas lié aux promesses, mais à la façon dont vous utilisez la propriété calculée.

Le meilleur endroit pour un findRecord/findAll est dans un crochet de modèle dans la route. Il est préférable de ne pas se fier à firstObject pour ce que vous décrivez. Vous n'avez aucune garantie quant à l'enregistrement qui sera le premier à modifier les données de votre application.

Les propriétés calculées sont vraiment destinées à regarder d'autres données et à mettre à jour les informations affichées à propos de ces données, pas à extraire elles-mêmes des données du magasin. Ils nécessitent des arguments qui sont les noms des données qu'ils sont censés surveiller pour les mises à jour. Puisque votre propriété calculée ne regarde rien, elle ne se déclenche jamais. Voici un exemple.

firstName: null, 
    lastName: null, 

    fullName: Ember.computed('firstName', 'lastName', function() { 
    let firstName = this.get('firstName'); 
    let lastName = this.get('lastName'); 

    return `${firstName} ${lastName}`; 
    }) 

Vous pouvez en savoir plus en Computed Properties dans les guides. Vous aurez beaucoup plus de facilité si vous définissez un crochet de modèle dans une route qui obtient les informations de l'utilisateur à l'aide de findRecord, puis le transmet aux composants enfants ou le définit sur un service si de nombreux composants différents ont besoin de l'utilisateur information.