SC.Query.local
和SC.Query.remote
之间有什么区别?为什么这两种查询都会发送到我的数据源的fetch
方法?
答案 0 :(得分:3)
“本地”和“远程”这两个词与数据的来源无关 - 您的所有数据可能来自您的服务器,无论如何SC.Query
都无关紧要。这些词的含义是决策的制作地点。 本地查询由SproutCore本地完成(并在现场更新!); 远程查询依赖于您的服务器来做出决定。
基本的基本区别是:“我的本地商店可以/应该/是否拥有完成此请求所需的所有记录的本地副本?”如果是,请使用本地查询;如果不是,请使用远程查询。
例如,在文档编辑应用程序中,如果查询是“获取所有已登录用户的文档”,则必须由有权访问“所有用户的所有文档”的人做出决定 - 客户端出于性能和安全的原因,应该明显没有!因此,这应该是远程查询。但是,一旦所有用户的文档都在本地加载,那么另一个查询,例如“在过去三天内编辑过的所有用户文档”都可以(并且应该)在本地执行。
同样,如果查询正在查看少量记录,则客户端加载所有记录并在本地搜索 ;如果它是跨越数百万条记录的搜索,客户端无法加载和搜索,那么必须依赖远程服务器来实现。
商店会向您的数据源的fetch
方法发送远程和本地查询,您可以通过query.get(‘isRemote’)
告知差异。但商店希望数据源在每种情况下做不同的事情。
您的数据源负责完成远程查询。您可能会进行服务器调用,然后通过store.loadRecords(recordTypes, hashes, *ids*)
(返回商店密钥数组)加载记录(如果需要),然后使用store.dataSourceDidFetchQuery(query, storeKeys)
来完成查询并指定结果。
另一方面,通过本地查询,商店实际上是在礼貌地打电话 - 它让您的数据源知道已经请求了这种信息,因此您可以决定是否'我想从服务器加载一些数据。无论数据源是否采取任何操作,商店都将很乐意自己完成查询。如果您决定从服务器加载一些数据,您只需要让商店知道store.dataSourceDidFetchQuery(query)
- 这次没有商店密钥,因为商店正在自己决定哪些记录满足查询。< / p>
当然,还有其他方法可以实现这一切。 SC.Store建立(有点争议)从其数据源积极请求信息,因此可以使用除本地查询之外的任何内容运行应用程序,或通过toMany
关系触发大多数服务器请求(运行{ {1}})。我个人最喜欢的方法是在我的应用程序状态图中使用远程查询进行所有数据加载,然后使用本地查询填充我的控制器和关系。
请参阅Records guide,dataSource.retrieveRecord
文档顶部的SCQL documentation和SC.Store
/ SC.DataSource
文档,了解更多信息。< / p>