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

时间:2014-04-16 17:50:50

标签: javascript angularjs

我有一个很复杂的SPA,我在角度编码。在其中,我需要跟踪实际的模型数据 - 操作为"我从中获取的东西并发送到后端API服务器"。我也有viewstate数据 - "我记录的东西,但不要发送到API服务器"。模型数据类似于用户昵称或论坛帖子主体,而视图状态数据是"这个特定的UI元素被扩展" - 基本上它的应用状态。

我想知道的是:对此有最好的做法吗?在我更复杂的控制器中,我有一个重复的元素,每个元素都有expando-UI元素。诱惑是将这些expandos放在ng-if中并将.showing变量附加到对象。例如,可以想象这种文本:ng-repeat="user in users", ng-click="user.showing = !user.showing", ng-if="user.showing"在几个div中。这非常方便,因为重复项目的视图状态所需的所有信息都在重复上。

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

我对这里要做的事情有了一些想法。我可以将所有视图状态变量封装在控制器中它们自己的位置,这会产生副作用,使得ng-repeats更难以实现(你必须使用$ index属性查找视图状态变量)

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

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

我倾向于指示路线。这似乎是角度的做事方式。每个UI元素并不真正需要在其自身之外共享其状态,我目前只是真的这样做,因为我的初始Web模型是我获得的大型HTML模板,然后附加了ng-repeat指令。我可以将Post,Comment,Author等元素分解为指令,然后只保留自己的状态。

1 个答案:

答案 0 :(得分:3)

是的,为了它的价值,我最终将一切都变成了指令。基本上,需要跟踪视图状态的ng-repeat内的任何项都有自己的指令(因此它自己的隔离范围)。我还养成了在scope.view上隐藏与视图相关的变量的习惯,所以scope.view.showingExpandedReply = true,或者其他什么。这样我就不必用视图状态信息来污染数据模型。