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);
}