2017-05-13 1 views
1

J'ai un initialisateur d'instance (ci-dessous) pour un panier. Le panier est un modèle de données de braises parce que je persiste jusqu'à la fin. Je veux tous les instances de mon application ember pour avoir un ID de chariot attribué avant faire autre chose.ember: attente jusqu'à la fin de l'instance-initializer avant toute autre opération

Je sais que l'idéal est asynchrone, mais les prix des articles sur le site dépendent du panier. Je trouve qu'il serait plus facile de gérer à la fois l'extrémité avant et l'arrière si je peux dépendre du chariot existant toujours.

Comment puis-je demander à ember de ne rien faire d'autre tant que l'initialisation de l'instance de panier ne se termine pas et que le modèle de chariot de données de braises ne se résout pas?

Mon exemple initialiseur:

export function initialize(appInstance) { 
    let CartService = appInstance.factoryFor('service:cart'); 
    let cart = CartService.create(); 

    // check if there's a cart id present in localStorage 
    if (window.localStorage) { 
     if (window.localStorage.getItem('cart')) { 
      //previous cart id found 
      cart.loadCart(window.localStorage.getItem('cart')) 
     } else { 
      // no LS cart found, create a new one 
      cart.createCart(); 
     } 
    } 

    appInstance.register('cart:main', cart, { instantiate: false }); 
    appInstance.inject('route', 'cart', 'cart:main'); 
    appInstance.inject('controller', 'cart', 'cart:main'); 
    appInstance.inject('component', 'cart', 'cart:main'); 
} 

export default { 
    name: 'cart', 
    initialize 
}; 

Il gère deux scénarios: un chariot existe dans localStorage ou voiturette existe, créez un nouveau. Ces deux méthodes sont:

// cart service methods 

loadCart(jsonCart) { 
    // called from instance-initializer when a previous cart is found in localStorage 

    let incomingCart = JSON.parse(jsonCart); // the raw cart in LS 

    this.get('store').findRecord('cart', incomingCart.cartid).then(cart => { 
     cart.setProperties(incomingCart); 
     cart.save(); 
     set(this, 'cartObj', cart); 
    }); 
}, 
createCart() { 
    // called from instance-initializer when no prev cart is found 

    let cart = this.get('store').createRecord('cart'); 
    cart.save().then(response => { 
     window.localStorage.setItem('cart', JSON.stringify(response)); 
    }); 
    set(this, 'cartObj', cart); 
} 

Répondre

1

J'ai le même problème ces jours-ci. Je l'ai trouvé ces alternatives:

  1. L'utilisation initialiseurs d'application (pas d'instance d'application initialiseur): initialiseurs d'application ont deferreadiness method de reporter l'état de préparation de la demande. Je pense que cela ne s'applique pas à ma situation, car mes services ne sont pas encore initialisés.
  2. Utilisation de l'appel distant sync: Les navigateurs en avertissent. C'est mauvais pour l'expérience utilisateur.
  3. Opération asynchrone en attente dans application route: Le hook de modèle de la route d'application renverra une promesse qui sera satisfaite lorsque toutes les opérations asynchrones seront terminées. Montré dans ce sample twiddle.

Je pense que je vais préférer le troisième. Mais je suis ouvert aux nouvelles idées.