ember:在执行任何其他操作之前等待实例初始化程序完成

时间:2017-05-13 15:57:57

标签: ember.js ember-data

我有一个购物车的实例初始化程序(如下)。购物车是一个余烬数据模型,因为我坚持到后端。我希望我的ember应用程序的所有实例在执行任何其他操作之前为分配购物车ID。

我知道理想是异步,但网站上的商品价格取决于购物车。我发现,如果我可以依赖总是存在的购物车,那么处理前端和后端都会更容易。

在购物车实例初始化程序完成且ember-data购物车模型结算之前,如何告诉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);
}

1 个答案:

答案 0 :(得分:1)

这些天我也有同样的问题。我找到了这些替代品:

  1. 使用应用程序初始化程序(不是应用程序实例初始化程序):应用程序初始化程序具有deferreadiness method 推迟申请的准备。我认为这不适用于我的情况,因为我的服务尚未初始化。
  2. 使用sync远程呼叫:浏览器会对此发出警告。这对用户体验不利。
  3. application route中等待异步操作:应用程序路由的模型挂钩将返回一个在所有异步操作完成时将满足的promise。如[{3}}所示。
  4. 我想我更喜欢第三个。但我愿意接受新的想法。