AngularJS与Redux的结合

8

我一直在学习Redux。大部分的内容都是将Redux与React结合使用。但是我使用的是AngularJS。相比于在AngularJS作用域内管理状态并允许AngularJS管理绑定,使用Redux是否有更好的理由呢?


Redux的使用意图是与视图库(如前面提到的React)一起使用。Angular不仅仅是一个视图库,它是一个框架。您试图通过Redux实现什么功能,在Angular中无法解决?似乎将两者混合使用会涉及很多特性重叠/代码重复。 - Benjamin Solum
什么也没有。我刚刚在谷歌上快速搜索了一下AngularJS和Redux。有关使用Redux来管理Angular中的状态的文章,让我想知道为什么要这样做。我想你回答了我的问题。 - David Champion
老实说,我从来没有想过将这两个混合使用 :). 我无法评论任何潜在的好处,只是感觉这是一种奇怪的组合。你有提到的文章链接吗? - Benjamin Solum
也许这可以作为一种逐步将现有的Angular应用程序移植/转换到Redux / React的方法。 - Dmitry Shvedov
2个回答

20
Redux在Angular 1.x中对于具有大量共享状态的情况有益。在我工作的Angular应用程序中,我们有许多页面具有共享模型和几个组件对该模型进行(重叠)更改。保持数据同步或拥有标准的更改方式并不总是容易的。虽然您当然可以只使用Angular服务来实现类似的功能,但Redux是一个不错的选择。 Redux使用的单向数据流比通常在Angular中使用的方法更容易(在我看来)理解。相反,引入Redux可能会降低您编写快速原型的能力,因为需要更多的工作来传递数据。这对我来说无关紧要,但可能对其他人很重要。

Redux的主要原则仍然适用于Angular应用程序:

  • 单一真相来源(单一状态对象)。就像我之前说的,我认为将状态放在一个地方管理比在不同的Angular作用域或服务中管理更容易。在某些应用程序中,作用域混乱是一个真正的问题。
  • 状态是不可变的。这是大多数与Angular摩擦的地方,因为Angular(和Javascript)使数据突变变得非常容易。但它确实帮助您编写更安全的代码。由于只能通过创建副本来更改不可变对象,因此您可以更加自信地进行指令中的任何数据操作,而不会破坏其他指令。反过来,您可以期望其他指令不会修改您的数据。所有这些修改都通过一个中心位置(单一状态对象,通过reducer)进行,因此更容易找到它们。
  • 更改由纯函数进行。我认为这在任何JS应用程序中都很有用。你拥有越多没有大量副作用或框架依赖的代码,你的应用程序就越容易理解和测试。与Angular代码的许多测试具有大量的应用程序设置样板文件相比,测试reducer非常简单,因为它只是一个Javascript函数。
使用Redux意味着你的代码中Angular特定的部分会减少。这意味着如果你决定不使用Angular,你将有更容易的升级路径。或者即使你只是想迁移到Angular 2。虽然难以说有多容易。
我认为由于Angular更像一个框架而不是一个库,所以Redux和Angular之间没有太多重叠。但在Redux中有一些东西在Angular中无法充分利用。你可能知道应用程序状态的哪一部分正在改变,但是Angular仍然要运行它的digest周期并检查所有内容。不过Angular 2在这方面做得更好。你需要跳过一些障碍才能使所有指令与不可变数据一起工作。尤其是如果你想通过Redux store发送用户更改的每个字段,因为ng-model希望改变你传递给它的属性。
每个应用程序都不同,但在我工作的类型的Angular应用程序中使用Redux是有意义的。

JeffB,你提到将用户更改的每个字段都发送到存储中。这是一种情况吗?我想这取决于设计师确定他们想要保留什么级别的应用程序状态,对吗? - cgatian
是的,这取决于您的需求或开发人员的偏好。在Redux存储中保存每个用户输入更改很困难,因为ng-model会直接改变您的数据。当用户需要输入表单数据时,创建可变副本会更容易,然后在完成后将结果保存到Redux存储中。但是您可能有不适用于该方法的要求。 - JeffB
我早就想到了。如果可以的话,我有以下问题需要解决。任何建议都将不胜感激。https://dev59.com/zJffa4cB1Zd3GeqP3R4s - cgatian
@JeffB 如果你想将“单一真相来源”的概念应用于Angular应用程序,但实际上不使用ngRedux或ReduxJS,那么你会在哪里创建这个单一的来源呢?作为父级作用域上的不同元素?作为父级作用域上的存储器(例如$scope.$parent.store = {prop1: true,...})?还是一个单独的全局变量? - Rozgonyi
@Rozgony,你可以创建myappStateService并将其用作单一的真相状态,对吧?绝对不要在rootScope中使用(这正是某种全局变量)。 - Rantiev

0
Redux 可以与任何 JavaScript 技术一起使用。简而言之,您可以将其集成到 Agular 项目中。现如今,它正在改变应用程序构建的方式。它通过使用单向数据流的方式提供了一种构思应用程序的新方法。因此,这使您能够更好地控制应用程序状态并消除与数据可变性相关的问题工具。请查看此优秀的 在 Angular 项目中使用 Redux 的教程

1
那篇文章是关于Angular 2+的,OP明确要求使用angularjs(1.x)。 - BlackICE

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接