AngularJS.中分离模型和视图状态

Separating Model and View State in AngularJS

本文关键字:视图状态 模型 分离 AngularJS      更新时间:2023-09-26

我有一个很大的复杂SPA,我正在用angular进行编码。在它中,我需要跟踪实际的模型数据——操作为"我从后端API服务器获取并发送到后端的东西"。我还有视图状态数据——"我跟踪的东西,但不会发送到API服务器"。模型数据是用户昵称或论坛帖子正文之类的东西,而视图状态数据是"扩展了这个特定的UI元素"——基本上是应用程序状态。

我想知道的是:有没有一种最佳实践的方法?在我更复杂的控制器中,我有一个ng个元素的重复,每个元素都有expandoUI元素。诱惑是将这些expandos放在ng if中,并将.showing变量附加到对象中。例如,可以想象这样的文本:ng-repeat="user in users", ng-click="user.showing = !user.showing", ng-if="user.showing"在几个div中。这真的很方便,因为我们需要的关于重复项的视图状态的所有信息都在重复项上。

这闻起来也很糟糕——它可能会覆盖从API服务器获取的字段,而且由于我缓存数据模型以保存在API往返(并处理实时更新)上,这也意味着当用户导航离开并返回SPA中的同一位置时,视图状态会得到保留,或者如果相同的数据在屏幕上显示两次,则视图状态将被链接(例如,相同的配置文件在屏幕上的三个位置显示为对帖子的三个回复)。

我对在这里做什么有一些想法。我可以将所有视图状态变量封装在控制器中自己的位置,这样做的副作用是使ng重复更难实现(您可能必须使用$index属性查找视图状态变量)。

我可以将这一问题封装在一个指令中,对指令调用ng repeat,该指令本身具有隔离范围,并且只有一组状态变量要跟踪(因此不需要担心跟踪复杂的视图状态)。

我完全可以做SO社区建议的其他事情。

我倾向于指示路线。这似乎是一种有角度的做事方式。每个UI元素实际上并不需要在自己之外共享其状态,我目前真正这样做只是因为我最初的网络模型是大型HTML模板,我得到了这些模板,然后附加了ng个重复指令。我可以将Post、Comment、Author等元素分解为指令,然后它们就可以保持自己的状态。

是的,不管怎样,我最终把所有东西都分解成了指令。基本上,ng repeat中任何需要跟踪视图状态的项都有自己的指令(因此也有自己的隔离范围)。我还养成了在scope.view上隐藏视图相关变量的习惯,所以scope.view.showingExpandedReply=true,或者其他什么。这样我就不必用视图状态信息污染数据模型。