Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular @使用API的ngrx,我如何识别结果的差异?_Angular_Laravel_Api_State_Ngrx - Fatal编程技术网

Angular @使用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调用可能会给出相同的结果,但属性略有不同,而我遇到的问题是如何用@ngrx实现这一点

例如:

  • 我们有一个用户角色:
    系统用户
    • 非登录用户使用
      /api/activities
      获取活动
    • 系统用户
      使用
      /api/su/activities
      获取活动
    • 两个API调用都返回活动,但其中一个也返回属性
      activity\u categories
  • 在登录
    SU
    之前,他们使用
    /api/activities
    获取活动,并将结果存储在存储中
  • 然后
    SU
    登录,现在需要每个活动(活动类别)的额外数据,并检查活动是否已经获取。如果是,它将跳过API调用(
    /API/su/activities
  • SU
    现在会收到一个错误,因为每个活动都缺少其类别(活动['activity\u categories'])

那么,有没有一个聪明的方法来解决这个问题呢?:)

有两种可能的解决方案。最简单的方法是忽略这些数据是“相同”的事实,并将两组不同的活动数据(一组是丰富的,一组不是)作为完全独立的内容存储在状态存储中

另一个选项是重构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)订阅您的活动,然后在控制器中,如果您检测到没有丰富的数据,请发出请求以获取它并将其置于状态。然后,控制器将自动接收更新的数据。如果要确保组件模板在填充类别之前不会收到数据,可以在上设置筛选器。如果听起来有道理的话,我可以把它写下来作为另一个答案?好吧,我想我会使用不太复杂的解决方案,在这个解决方案中,我为每个用户角色都有一个单独的状态(甚至是存储)。在考虑这些解决方案时,我认为不太复杂的解决方案更容易扩展,并且不会引起太多的麻烦,特别是如果其他开发人员打算使用这些代码的话。谢谢你的帮助和很好的回答:)