加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

angularjs – 是否有可能使用$rootScope作为商店在Angular 1中实

发布时间:2020-12-17 17:46:04 所属栏目:安全 来源:网络整理
导读:如果你是一个很大的遗留Angular 1代码库并且你不想引入新的依赖项(比如ngRedux),那么开始使用经典的Angular 1功能是一个糟糕的主意,比如$rootScope,$broadcast,$on,$watch实现类似Redux的架构? 我看到它的方式,可以做如下: 对于商店/模型 – 使用$rootScop
如果你是一个很大的遗留Angular 1代码库并且你不想引入新的依赖项(比如ngRedux),那么开始使用经典的Angular 1功能是一个糟糕的主意,比如$rootScope,$broadcast,$on,$watch实现类似Redux的架构?

我看到它的方式,可以做如下:

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

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

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

解决方法

当然,你可以只使用$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
})

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

没有默认的动作处理程序,您无法轻松设置存储的初始状态.你仍然使用$watch和digest,你可能想要避免.

此外,你不能订阅所有的更新,没有一个点重置像Redux这样做的所有时间旅行的东西.

如果你想继续使用Redux作为模式,你可能会以一些帮助程序结束,这将使你的代码更像Redux.

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

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

开始了.现在,您可以使用商店服务进行操作

angular.module('app').controller('MyController',($scope,store) => {
  store.subscribe(() => {
    //you may not to care about $scope.$digest,if your action was triggered within angular scope as well 
    $scope.count = store.getState();
  });

  $scope.onClick = () => store.dispatch({type: 'INCREMENT',value: 1});
});

现在,您有一个正确的设置,您的订户不知道导致调度的操作,您的操作创建和操作减少逻辑完全独立,因为它需要Redux模式.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读