是否可以使用$ rootScope作为商店在Angular 1中实现类似Redux的架构?

时间:2016-04-11 13:40:42

标签: angularjs redux flux

如果你是一个很大的遗留Angular 1代码库并且你不想引入新的依赖项(比如ngRedux),那么开始使用经典的Angular 1功能会是一个糟糕的主意,比如$ rootScope,$ broadcast,$ on,$ watch实现类似Redux的架构?

我看到它的方式,可以按照以下方式完成:

  • 对于商店/模型 - >使用store.dispatch(ACTION)
  • $rootScope.$broadcast(ACTION) - >使用$rootScope
  • Reducers将作为注入$on(ACTION)和执行$rootScope
  • 的服务实施
  • 控制器可以使用$watch监视$rootScope上的更改,并更新视图或视图可以直接绑定到$rootScope属性

只要您不遵守timestamp属性上的奇怪的异地突变,就可以将所有应用程序逻辑保留在Reducers中并将控制器代码保持在最低限度,这是我能够做到的最大缺点由于Angular 1昂贵的消化周期,因此具有可怕的性能。但如果你也可以坚持不可变数据结构,甚至可能不是这样。

这是个坏主意吗?有没有人试过这个?

1 个答案:

答案 0 :(得分:7)

当然,你只能使用you must be fully authenticated to view this resource做你的事情。但是还有很多其他目的会干扰你的国家。

让我们看看:

$rootScope

如果你愿意,你可以这样做,但你发现存在不明确的不变性问题。很难控制你的动作处理程序是纯粹的,因为实际上并非如此。

没有默认的操作处理程序,您无法轻松设置存储的初始状态。你仍然使用// reducer-like $rootScope.$on('COUNTER_INCREMENT', (e, action) => { //I don't use += to emphase immutability of count property; $rootScope.count = $rootScope.count + action.value; }); //action-ish creator $rootScope.$broadcast('COUNTER_INCREMENT', {value: 5}); //store subscribe-like $rootScope.$watch('count', (count) => { //update something in your component }) 和摘要,你可能想避免。

此外,您无法订阅所有更新,没有任何一个重置点可以像Redux那样通过时间旅行来完成。

如果你想继续使用Redux作为模式,你可能会得到一些帮助,使你的代码更像Redux。

那么,为什么不从一个简单的角度效用服务开始使用Redux:

$watch

我们走了。现在,您可以使用商店服务进行操作

angular.module('app', []).factory('store', () => {
  //if you have many reducers, they should be as separate modules, and imported here
  function counter(state = 0, action) {
    switch (action.type) {
      case 'INCREMENT':
        return state + action.value;
      default:
        return state;
    }
  }

  // here you can add here middlewares that make Redux so powerful
  return Redux.createStore(counter);
});

现在您有一个正确的设置,您的订阅者不知道导致调度的操作,您的操作创建和操作减少逻辑完全独立于Redux模式所需。