ember:等到实例初始化器完成后再做其他事情
ember: waiting until instance-initializer completes before doing anything else
我有一个用于购物车的实例初始化程序(如下)。购物车是一个 ember 数据模型,因为我坚持到后端。我希望我的 ember 应用程序的 所有 个实例在 执行任何其他操作之前分配一个购物车 ID。
我知道理想是异步的,但网站上的商品价格取决于购物车。我发现如果我可以依赖始终存在的购物车,那么处理前端和后端会更容易。
如何告诉 ember 在购物车实例初始化程序完成并且 ember-数据购物车模型解析之前不要做任何其他事情?
我的实例初始化程序:
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
};
它处理两种情况:localStorage 中存在购物车,或者不存在购物车,创建一个新的。这两种方法是:
// 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);
}
我最近也遇到了同样的问题。我找到了这些替代品:
- 使用应用程序初始化器(不是应用程序实例初始化器):应用程序初始化器有 deferreadiness method
推迟应用程序的准备。我认为这不适用于我的情况,因为我的服务还没有初始化。
- 使用
sync
远程调用:浏览器对此发出警告。对用户体验很不利。
- 等待
application route
中的异步操作:应用程序路由的模型挂钩将 return 一个承诺,当所有异步操作完成后,该承诺将得到满足。显示于此sample twiddle。
我想我会更喜欢第三个。但我乐于接受新想法。
我有一个用于购物车的实例初始化程序(如下)。购物车是一个 ember 数据模型,因为我坚持到后端。我希望我的 ember 应用程序的 所有 个实例在 执行任何其他操作之前分配一个购物车 ID。
我知道理想是异步的,但网站上的商品价格取决于购物车。我发现如果我可以依赖始终存在的购物车,那么处理前端和后端会更容易。
如何告诉 ember 在购物车实例初始化程序完成并且 ember-数据购物车模型解析之前不要做任何其他事情?
我的实例初始化程序:
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
};
它处理两种情况:localStorage 中存在购物车,或者不存在购物车,创建一个新的。这两种方法是:
// 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);
}
我最近也遇到了同样的问题。我找到了这些替代品:
- 使用应用程序初始化器(不是应用程序实例初始化器):应用程序初始化器有 deferreadiness method 推迟应用程序的准备。我认为这不适用于我的情况,因为我的服务还没有初始化。
- 使用
sync
远程调用:浏览器对此发出警告。对用户体验很不利。 - 等待
application route
中的异步操作:应用程序路由的模型挂钩将 return 一个承诺,当所有异步操作完成后,该承诺将得到满足。显示于此sample twiddle。
我想我会更喜欢第三个。但我乐于接受新想法。