1

SC.Query.local和有什么区别SC.Query.remote?为什么这两种查询都会发送到我的数据源的fetch方法?

4

1 回答 1

3

“本地”和“远程”这两个词与数据的来源无关——您的所有数据可能都来自您的服务器,无论如何SC.Query都无关紧要。这些词的意思是做出决定的地方。本地查询由 SproutCore 本身在本地完成(并实时更新!);远程查询依赖于您的服务器来做出决定。

基本的根本区别是:“我的本地商店可以/应该/是否拥有满足此请求所需的所有记录的本地副本?” 如果是,请使用本地查询;如果不是,请使用远程查询。

例如,在文档编辑应用程序中,如果查询是“获取所有登录用户的文档”,则必须由有权访问“所有用户的所有文档”的人做出决定——客户端显然不应该这样做有,出于性能和安全的原因!因此,这应该是一个远程查询。但是一旦用户的所有文档都在本地加载,则可以(并且应该)在本地执行另一个查询,例如“所有用户在过去三天内编辑过的文档” 。

同样,如果查询正在查看少量记录,则客户端将它们全部加载并在本地搜索是有意义的;如果它是对数百万条记录的搜索,而客户端无法加载和搜索,则必须依赖远程服务器来完成。

商店会将远程和本地查询发送到您的数据源的fetch方法,您可以在其中通过query.get(‘isRemote’). 但是商店希望数据源在每种情况下做不同的事情。

完成远程查询是您的数据源的责任。您可能会进行服务器调用,然后通过store.loadRecords(recordTypes, hashes, *ids*)(返回存储键数组)加载记录(如果需要),然后用于store.dataSourceDidFetchQuery(query, storeKeys)完成查询并指定结果。

另一方面,对于本地查询,存储本质上是在进行礼节性拜访——它让您的数据源知道已请求此类信息,因此您可以决定是否要从服务器加载一些数据。无论数据源是否采取任何行动,存储都会很高兴地自行完成查询。如果你决定从服务器加载一些数据,你只需要让存储知道store.dataSourceDidFetchQuery(query)——这次没有存储键,因为存储会自行决定哪些记录满足查询。

当然,还有其他方法可以实现这一切。SC.Store 的设置(有点争议)从其数据源主动请求信息,因此可以只使用本地查询来运行应用程序,或者通过触发大多数具有toMany关系的服务器请求(通过 运行dataSource.retrieveRecord)。我个人最喜欢的方法是在我的应用程序的状态图中使用远程查询完成所有数据加载,然后只使用本地查询填充我的控制器和关系。

请参阅记录指南、文档顶部的SCQL 文档SC.Query以及SC.Store/SC.DataSource文档以获取更多信息。

于 2013-09-20T17:29:20.900 回答