2017-02-12 1 views
1

j'ai écrit un service pour les notifications de chargement:propriété calculée sur un service qui accède au magasin

import Ember from 'ember'; 

export default Ember.Service.extend({ 
    sessionUser: Ember.inject.service(), 
    store: Ember.inject.service(), 

    read() { 
    let currentUserId = this.get('sessionUser.user.id'); 
    return this.get('store').query('notification', { 
     userId: currentUserId, 
     read: true 
    }); 
    }, 

    unread() { 
    let currentUserId = this.get('sessionUser.user.id'); 
    return this.get('store').query('notification', { 
     userId: currentUserId, 
     read: false 
    }); 
    } 
}); 

Je veux changer la couleur d'une icône dans la barre de navigation quand il y a des notifications non lues. La barre de navigation est un composant:

import Ember from 'ember'; 

export default Ember.Component.extend({ 
    notifications: Ember.inject.service(), 
    session: Ember.inject.service(), 

    hasUnreadNotifications: Ember.computed('notifications', function() { 
    return this.get('notifications').unread().then((unread) => { 
     return unread.get('length') > 0; 
    }); 
    }) 
}); 

Et le modèle utilise alors la hasUnreadNotifications propriété de décider si la classe de mise en surbrillance doit être utilisé:

<span class="icon"> 
    <i class="fa fa-bell {{if hasUnreadNotifications 'has-notifications'}}"></i> 
</span> 

Toutefois, il ne fonctionne pas. Bien que le magasin soit appelé et que les notifications soient renvoyées, le hadUnreadNotifications ne se résout pas à un booléen. Je pense que c'est parce que cela renvoie une promesse et le modèle ne peut pas faire face à cela, mais je ne suis pas sûr.

Questions

  • est-il Ember idiosyncrasique pour envelopper le magasin dans un service comme celui-ci. Je fais ceci parce que c'est gênant de charger les notifications dans la route d'application juste pour montrer le compte.
  • Pourquoi hasUnreadNotifications ne renvoie-t-il pas un booléen?
  • Est-il possible de créer des propriétés read et unread au lieu de fonctions, de sorte qu'une propriété calculée peut être créée dans le service pour calculer le nombre?

Répondre

2

Renvoyer la promesse de la propriété calculée ne fonctionnera pas. Les propriétés calculées ne sont pas prises en compte par Promise. pour le faire fonctionner, vous devez retourner DS.PrmoiseObject ou DS.PromiseArray. Vous pouvez lire les autres options disponibles à partir de ce igniter article.

import Ember from 'ember'; 
import DS from 'ember-data'; 

export default Ember.Component.extend({ 
    notifications: Ember.inject.service(), 
    session: Ember.inject.service(), 

    hasUnreadNotifications: Ember.computed('notifications', function() { 
     return DS.PromiseObject.create({ 
      promise: this.get('notifications').unread().then((unread) => { 
       return unread.get('length') > 0; 
      }) 
     }); 
    }) 

});