Angular @使用API的ngrx,我如何识别结果的差异?
我偶然遇到了一个问题,我觉得随着时间的推移,问题越来越严重。我遇到的问题是,API调用可能会给出相同的结果,但属性略有不同,而我遇到的问题是如何用@ngrx实现这一点 例如:Angular @使用API的ngrx,我如何识别结果的差异?,angular,laravel,api,state,ngrx,Angular,Laravel,Api,State,Ngrx,我偶然遇到了一个问题,我觉得随着时间的推移,问题越来越严重。我遇到的问题是,API调用可能会给出相同的结果,但属性略有不同,而我遇到的问题是如何用@ngrx实现这一点 例如: 我们有一个用户角色:系统用户。 非登录用户使用/api/activities获取活动 系统用户使用/api/su/activities获取活动 两个API调用都返回活动,但其中一个也返回属性activity\u categories 在登录SU之前,他们使用/api/activities获取活动,并将结果存储在存储中
- 我们有一个用户角色:
。系统用户
- 非登录用户使用
获取活动/api/activities
使用系统用户
获取活动/api/su/activities
- 两个API调用都返回活动,但其中一个也返回属性
activity\u categories
- 非登录用户使用
- 在登录
之前,他们使用SU
获取活动,并将结果存储在存储中/api/activities
- 然后
登录,现在需要每个活动(活动类别)的额外数据,并检查活动是否已经获取。如果是,它将跳过API调用(SU
)/API/su/activities
现在会收到一个错误,因为每个活动都缺少其类别(活动['activity\u categories'])SU
那么,有没有一个聪明的方法来解决这个问题呢?:) 有两种可能的解决方案。最简单的方法是忽略这些数据是“相同”的事实,并将两组不同的活动数据(一组是丰富的,一组不是)作为完全独立的内容存储在状态存储中 另一个选项是重构API以提供一个端点,该端点只返回活动的额外类别数据(例如,
/API/su/activitiycategories
),然后如果基本活动数据已处于该状态,则只调用第二个端点。然后用额外的类别数据更新状态数据
您可能需要在状态中存储一个标志(例如“activitiesEnrichedWithCategories”),以控制是否需要执行该调用。在基本活动不存在的情况下,您将需要执行这两个调用来获取丰富的数据,或者调用/api/su/activitycategories/
端点
第二个选项的实现要复杂得多,但如果有很多活动,可能值得付出额外的努力。我建议您在对象中将活动类别预定义为null,然后如果用户登录,您可以将该值指定给此variable@Ricardo我上面提到的问题是,它甚至不执行其他api调用,因为活动的第一次提取已经在存储中。@RamoMislimi您对存储没有控制权吗?为什么不在登录后重新设置初始状态来清理存储。。。就像执行2个操作,清理存储,执行restcall@Ricardo我也想过,这是一个可能的解决办法。但是,如果您在登录时能够访问这两个页面,那么这不是一个可能的解决方案。我可以阻止用户访问制作
/api/activities
的页面,但这不是一个好的解决方案。一个选项是创建一个类似的页面,但使用另一个api调用(/api/su/activities
)。我同意,第二个选项要复杂得多。也许可以对此做一个通用的解决方案,也许这样我就可以指定在使用select(x)
获取数据时,还可以指定我需要它具有哪些类型的值,如果没有,则执行获取(如您所述),以获取额外数据并填充已存储的数据。但是做这样的事情感觉像是一团糟,而且很耗时。我想我将把它们分成各自的状态(su活动
和活动
)。谢谢你的帮助。我不是@ngrx方面的专家,只是不知道我是否遗漏了其他内容。@RamoMislimi确实有一些方法可以做到你所描述的,但我不确定它是否是最好的结构。另一个更干净的解决方案是通过select(x)订阅您的活动,然后在控制器中,如果您检测到没有丰富的数据,请发出请求以获取它并将其置于状态。然后,控制器将自动接收更新的数据。如果要确保组件模板在填充类别之前不会收到数据,可以在上设置筛选器。如果听起来有道理的话,我可以把它写下来作为另一个答案?好吧,我想我会使用不太复杂的解决方案,在这个解决方案中,我为每个用户角色都有一个单独的状态(甚至是存储)。在考虑这些解决方案时,我认为不太复杂的解决方案更容易扩展,并且不会引起太多的麻烦,特别是如果其他开发人员打算使用这些代码的话。谢谢你的帮助和很好的回答:)