如果你是一个很大的遗留Angular 1代码库并且你不想引入新的依赖项(比如ngRedux),那么开始使用经典的Angular 1功能会是一个糟糕的主意,比如$ rootScope,$ broadcast,$ on,$ watch实现类似Redux的架构?
我看到它的方式,可以按照以下方式完成:
store.dispatch(ACTION)
$rootScope.$broadcast(ACTION)
- >使用$rootScope
$on(ACTION)
和执行$rootScope
$watch
监视$rootScope
上的更改,并更新视图或视图可以直接绑定到$rootScope
属性只要您不遵守timestamp
属性上的奇怪的异地突变,就可以将所有应用程序逻辑保留在Reducers中并将控制器代码保持在最低限度,这是我能够做到的最大缺点由于Angular 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模式所需。