2

让我们假设一个网页位于/items,列出所有可用的项目。
当用户点击一个项目时,浏览器会显示/items/:itemId并显示该项目的详细信息。AngularJs /滚动无限和后退按钮

当然,物品清单可能非常大。
这就是为什么我使用scroll infinite feature from Ionic(我使用基于Angular的框架)。然而,正如许多开发人员所知,处理从/items/:itemId/items的“后退按钮”是非常棘手的,因为Angular的控制器在页面转换期间被破坏,然后在列表页面再次加载时重新生成。
因此,在点击物品的细节之前,丢失了滚动位置和已经加载的确切物品。

我想到了一些解决方案,但我犹豫了,因为所有有“缺点”:

  • 只是该项目之前存储在$cacheFactory实际加载的项(完整的项目)(角的高速缓存或localStorage的)细节即将显示。
    因此,当按下后退按钮时(在详细信息页面上),/items的控制器可以从缓存中初始化数据,此外可以很容易地“记住”滚动位置。
    缺点是高速缓存中的数据可能陈旧...

  • “无需将任何加载的项存储在缓存中!”只需在缓存或localStorage中存储加载的实际块数即可。例如,我的REST API允许通过10来检索项目。
    如果用户被加载到第二块(最多20个元素),缓存中的变量将包含该值,然后控制器可以是初始化所有20个项目。
    缺点是它会涉及多个请求到服务器。事实上,如果用户加载了30个块,控制器需要对服务器进行30次调用...我可以自定义由服务器处理的块的大小,但是一个项目很重(几个长文本等等。 ),解释了为什么我只限于一个相对较小的数字。

  • 使用双向滚动(顶部和底部),以便DOM中始终有10个项目。我只需要存储已加载的最后一个块数,以便重新加载它。
    缺点:我将不得不自己写我的指令(可能是这样),因为目前没有Angular(从Ionic)指令。
    而且我认为双向处理仅当处理非常大的列表时才有用:超过2000行,以便减轻DOM。
    我不希望超过400排在大多数情况下,我...

有什么好的做法?也许另一个解决方案

回答

1

这是一种欺骗,但是如何使用模态(http://ionicframework.com/docs/api/service/ $ ionicModal /)来渲染细节?

+0

我想到了这一点,但细节本身包含的按钮,打开一些需要的模态..这将是没有非常UX重叠模态..你觉得呢?此外,它将共享父$范围丑陋 – Mik378 2014-09-23 10:48:35

+0

是的 - 同意。理论上你可以改变模态视图而不是弹出更多的模态? – 2014-09-23 10:49:22

+0

如果我改变模态视图,控制器模态不会很... SRP(单一责任原则)。具体来说,显示页面有一个右上角的按钮,打开聊天模式。如果我将聊天逻辑与显示逻辑混合在一起,那将是一团糟。左上角的按钮是作为后退按钮的“箭头”。 – Mik378 2014-09-23 10:50:48