【发布时间】:2013-05-12 13:16:05
【问题描述】:
我发现 Angular 对模型的使用令人困惑。 Angular 似乎采取了一种方法,即模型可以是你喜欢的任何东西——即Angular 不包含显式模型类,您可以使用原生 JavaScript 对象作为模型。
在我见过的几乎每个 Angular 示例中,模型实际上都是一个对象,要么是手动创建的,要么是通过资源从 API 调用返回的。因为我看过的几乎每个 Angular 示例都很简单,通常存储在控制器中 $scope 上的模型数据以及与模型相关的任何状态(例如选择)也存储在控制器中的 $scope 上。这适用于简单的应用程序/示例,但是当应用程序变得更复杂时,这似乎过于简单化了。例如,如果上下文发生变化,存储在控制器中的模型状态就有可能变成上下文并丢失;存储selectedGallery 和selectedPhoto 的控制器只能存储全局selectedImage,而不是每个画廊的selectedPhoto。在这种情况下,为每个画廊使用一个控制器可能会解决这个问题,但从 UI 的角度来看,这似乎是一种浪费,而且可能是不合适和不必要的。
Angular 对模型的定义似乎更接近于我认为的 VO/DTO,它是在服务器和客户端之间传递的哑对象。我的直觉是将这样一个对象包装在我认为的模型中——一个维护与 DTO/VO 相关的状态(例如选择)的类,根据需要提供修改器来操作 DTO/VO,并通知其余的应用对基础数据的更改。显然,Angular 的绑定很好地处理了最后一部分,但我仍然看到前两个职责的强大用例。
但是我还没有真正看到在我看过的示例中使用这种模式,但我也没有看到我认为可扩展的替代方案。 Angular 似乎通过强制使用单例来隐含地不鼓励使用服务作为模型(我知道有一些方法可以解决这个问题,但它们似乎没有被广泛使用或批准)。
那么我应该如何保持模型数据的状态?
[编辑]this question 中的第二个答案很有趣,与我目前使用的很接近。
【问题讨论】:
-
对于每种模型类型的一项服务,您不喜欢什么?
galleryService可以存储一系列画廊。 -
@MarkRajcok 我对单例服务没有任何问题。在很多情况下,它们就是您所需要的,并且在您描述的情况下,效果会很好。但是如果每个画廊都有一组照片,每个照片都需要维护状态呢?
-
我想我可能在这里过度简化和即时设计......我将拥有三个模型对象:1)照片对象,2)画廊对象(其中一个属性是照片对象数组),3)galleryCollection 对象(其中一个属性是图库对象数组)。 (galleryCollection 可能不是一个单独的对象——它可能只是galleryService 本身的一部分。)方法和属性可以存在于所有三个对象上。在我看来,每张照片和画廊都是一个单独的对象,它们只是由服务分组/管理/访问。模型可以在服务之外定义。
-
我同意@MarkRajcok(通常是这样)。最干净、最简单的方法是使用他所描述的服务。这极大地简化了测试并使每个服务更具可扩展性和可重用性。我认为重要的是不要将服务视为返回模型 object 而是返回模型 API。该 API 是您在控制器中用来访问一个或一组模型对象的 API。因此,
gallery服务可以使用熟悉的方法(获取、更新、删除等),同时在内部管理状态并使用单独的记录方法返回对象,例如$resource。 -
对于其他想知道的人:VO = Value Object, DTO = Data Transfer Object。
标签: javascript model angularjs state