Angular 2:使用.subscribe()时可以避免双重代码?

时间:2017-04-20 11:06:18

标签: javascript angular angular2-services

情景:

  • 用户在页面上并在他的购物车中选择他想要的商品
  • 将项目放入(全球)服务
  • 一旦用户进入购物车,他就会看到他所有的物品(通过服务装入组件)

问题:

  • 如果用户重新加载购物车,则所有商品都已消失

解决方案:

  • 所有项目都通过持久性存储存储,并且仅在用户重新加载网站时才会被调用

过程: 为了在网站重新加载后获取项目,我订阅了一个服务,该服务从持久性存储中收集所有项目。 当用户进入购物车时(通过重新加载或通过应用程序内的直接导航)设置项目的代码几乎相同,因为订阅仅在网站重新加载后触发。

示例代码:

    ngOnInit() {
        // We need the double code here because:
        // 1. The normal code is for normal navigation of the user (e.g.   from the home component to the shopping cart).
        //    The shopping cart is already filled with items
    this.shoppingCart = this.shoppingcartService.shoppingCart;

       // 2. The user reloads the site (or returns later after having it closed) and the shopping cart is filled (in the background)
       //    from the persistance store and emitted to all listeners of the application.
       this.shoppingcartEmitter = this.shoppingcartService.shoppingCartEmitter.subscribe( shoppingcart => {
        this.shoppingCart = shoppingcart;
    });
}

这是一个简化版本,但我可以看到我需要两行同样的行为。

问题:是否有可能避免双重代码? 我的问题是我需要处理购物车中的物品,我必须编写代码,以便在订阅内部和外部使用购物车。

1 个答案:

答案 0 :(得分:0)

你能做的就是把这两件事合并在一起

this.shoppingcartEmitter = this.shoppingcartService.shoppingCartEmitter.subscribe( shoppingcart => {
        this.shoppingCart = shoppingcart.concat(this.shoppingcartService.shoppingCart);
}