【发布时间】:2014-12-22 20:30:16
【问题描述】:
我正在使用 Cordova 和 AngularJS 制作一个移动应用程序。目前我已经安装了用于路由的 ui-router,但我对任何其他路由选择持开放态度。
我的愿望:我想缓存某些与参数绑定的视图。换句话说,我想缓存路径(或页面)。
示例情况:假设我们看到某个仪表板页面,单击某个书籍封面,该封面重定向到路径book/2。此路径首次加载到应用程序中。路由器从HomeController 重定向到BooksController(无论名称如何)。现在BooksController 为给定的$stateParams (book id = 2) 加载数据并创建包含所选书籍信息的视图。
在这种情况下我想要什么:
- 我返回仪表板页面 - 它已经加载(缓存?)
- 我再次选择第 2 本书
- 控制器或路由器注意到关于这本书的数据已经加载
- 视图并未重新创建,而是从缓存中获取
其实,最好根据路径缓存我访问的所有内容。预加载也很酷。
原因:性能。当我打开一些书籍列表时,我希望它快速显示。每次都创建视图时,页面更改的动画看起来很糟糕(不流畅)。
任何帮助将不胜感激。
编辑:
首先,由于我认为这是许多移动 HTML 应用程序程序员的常见问题,因此我想提供一些信息:
- 我不是在寻找黑客,而是在寻找一个明确的解决方案如果可能的话。
- 视图中的数据使用 AngularJS,所以是的,有 诸如
ng-bind、ng-repeat之类的东西。 - 数据 和 DOM 元素 都需要缓存。据我所知,浏览器的布局操作并不像重新创建整个 DOM 树那样昂贵。而重绘也不是我们可以省略的。
- 拥有单独的控制器是很自然的事情。因为我可以不带它离开,所以我无法想象它会如何工作。
我有一些半解决方案,但我会严格要求自己的愿望。
解决方案 1。
将所有视图放入一个文件(我可以使用 gulp builder 来完成)并使用ng-show。这是最简单的解决方案,我相信任何了解 AngularJS 的人都不会考虑它。
一个绝妙的技巧(来自@DmitriZaitsev)是创建一个辅助函数来根据当前位置路径显示/隐藏元素。
优点:
- 很简单。
- 某种预加载功能。
缺点:
- 所有视图都必须在一个文件中。不要问为什么不方便。
- 既然都是关于移动设备的,有时我想“清除”内存。我能想到的唯一方法是从 DOM 中删除这些孩子。脏但还可以。
- 我无法轻松地同时缓存 /book/2 和 /book/3。我必须在一些模板之上为每个与参数绑定的视图动态创建 DOM 子节点。
解决方案 2。
使用来自ui-router-extras 的粘性状态和未来状态,这太棒了。
优点:
- 分离视图。
- 用法很清楚,很简单,因为它只是
ui-router的插件。 - 可以创建动态子状态。所以可以缓存
book1,book2,但我不确定book/1和book/2
缺点:
- 同样,我不确定,但我没有找到缓存 pair/tuple
(view, parameters)的示例。除此之外,它看起来很酷。
【问题讨论】:
-
答案很大程度上取决于您尝试缓存的视图中的内容。
-
所有绑定的东西,比如
ng-repeat等等。所以我想这不仅仅是使用$templateCache -
我会尝试使用 ngHide 而不是实际替换视图。当然,这意味着重写你的一些代码。也许将两个 - nghide / ngshow结合在仪表板和书之间,但是在选择新书时,书籍视图更改。 (我想包含另外两个的第三个作用域/控制器对于保留路由是必要的。)
-
嗯,这是非常简单的方法,我希望有一个比隐藏 div 更通用的解决方案。示例中描述的情况并不真实,因为我不想污染我想要的感觉。实际上,我来自 gamedev,我很失望缓存结果在 webdev 中并不常见(或者我的看法不同,不确定)。
-
您尝试过ui-router-extras 中的粘性状态吗?还是这还不够?
标签: javascript angularjs angular-ui-router angular-routing