我已经学习角度2几个星期了。我对一件事有点困惑。请在此处比较数据的存储/共享方式:
https://github.com/Apress/pro-angular-2ed/blob/master/Angular%202.0/08%20-%20SportsStore%20-%20Orders%20and%20Checkout/SportsStore/app/model/product.repository.ts
在这里:
https://github.com/gothinkster/angular2-realworld-example-app/blob/master/src/app/shared/services/comments.service.ts
第一个链接显示了亚当·弗里曼(Adam Freeman)的书"Pro Angular"中是如何完成的。我们可以看到有一个名为ProductRepository的服务,这是存储所有产品的地方。此服务有一个构造函数,该构造函数从另一个服务初始化其数据,称为 StaticDataSource(在本书的后面部分,它更改为从其余 API 获取数据)。 总而言之:我们有一个组件,它注入了一个名为ProductRepository的服务。然后它使用来自此服务的 getProducts() 方法来接收所有产品(实际上只是在该服务中的一个数组中)。
现在让我们看一下第二个链接:
在这里,我们有一个评论服务。这次数据不存储在此服务中。我们只有一个名为getComments()的方法,它反过来从api服务执行另一个方法。 总而言之:我们有一个组件(ArticleComponent),它被注入了CommentsService。然后它在该服务上调用 getComments(),实际上每次调用它时都会向服务器发送一个 http.get 请求。
现在我的问题是关于这些方法之间的区别和后果。据我了解,在第一种情况下,所有数据仅从服务器获取一次(当应用程序加载时),然后全部存储在称为SomethingRepository(ProductRepository等)的服务中。 然而,在第二个链接中,每次我们使用服务(在任何组件中)时,我们都会直接从服务器接收数据。
关于它的最佳实践是什么?我只是担心,如果我们使用书中介绍的方法,那么我们将无法始终获得"最新"的数据,因为如果另一个客户端在此期间更改了某些内容,那么我们仍然会处理加载应用程序时下载的数据。另一方面,第二种方法可能会影响我们在组件之间共享数据的可能性。
我对此感到非常困惑,我不确定我是否真的应该将整个模型保留在我的应用程序中并拥有某种存储库,或者第二种方法更好。感谢您的任何帮助。
您在该网站上花费的时间不太可能改变产品集合。在这种情况下,这使得实际缓存获得的数据更加相关。
评论集合(例如在活动留言板中)可以在单个页面访问期间多次更改。这可能就是为什么他们选择在获取集合时始终从服务调用的原因。尽管在我看来,这不是正确的方法。最好是使用 websocket 连接,并从服务器更新集合,而不是每次都获取集合,很可能没有任何更改。
因此,总而言之,这取决于具体情况,集合到集合,您想使用哪种缓存。但我的建议是只调用服务器一次,如果它是像产品数组这样的静态数据。当它是动态数据时,您应该使用 websocket 来维护集合
不幸的是,正如大多数软件开发一样,哪种方法更好的答案是:"这取决于"。
正如您已经明确指出的那样,在客户端存储数据的方法的风险在于,如果其他用户更改了某些内容,您将面临拥有过时数据的本地缓存的风险。这是否重要取决于应用程序和缓存的数据类型以及数据更改的频率等。但是,从不必每次都去服务器获取列表的角度来看,您确实获得了更好的性能。某些类型的数据以这种方式缓存要安全得多(例如,美国各州列表,甚至是不太大且不会按分钟更改的产品目录) - 对于其他应用程序,您只是无法承受过时的数据。
因此,我的收获是使用最适合手头数据的方法。很多时候,处理使缓存失效所带来的复杂性并不值得它带来的性能优势,但这绝不是您可以在所有情况下使用的笼统声明。了解不同的方法以及优点和权衡,以便您知道何时应用哪种技术。
附言。这个问题很可能因为是基于意见而结束的。它可能更适合: http://softwareengineering.stackexchange.com