我在Angular.JS中使用路由器(使用内置的路由器,现在使用ui-route但解决方案都很好)在控制/模板对之间切换。当在几个这样的页面之间来回切换时,每次设置DOM看起来很糟糕需要花费一秒钟。反正是有角度保持在DOM树周围而不是每次重新创建它。我想我只是隐藏/播下每个页面的位而不是每次都删除/重新创建它们。
欢迎任何建议!
答案 0 :(得分:4)
您必须编写自己的ng-view指令来创建此类功能。
背后的基本理念是:
在路由更改之前,您只需将其放在不可见的缓存DIV中,然后取消注册范围侦听器,而不是销毁当前的视图元素和范围。为元素提供$$route.templateUrl
的数据属性,以便能够将其恢复。
然后从服务器获取下一个视图。
在路由更改之前,检查缓存项是否存在,如果它在缓存中,div从缓存中获取元素,重新注册侦听器并将当前视图放入缓存。
棘手的部分不是弄乱$scope
。因此,您可能需要$scope
中的构造函数和析构函数用于事件,也可能需要$ watchers。我不确定。
但说实话,如果您使用模板缓存并且仍需要1秒左右的时间来渲染,那么您可能会有一些效率低下的$watch
表达式或巨大的ng-repeat
。你应该考虑一些重构。
答案 1 :(得分:2)
我自己一直在研究这个问题。我在一个未加速的浏览器中处理相当旧的硬件。初始渲染是一个问题。我的早期解决方法是在您尝试时缓存预编译的模板。我发现这只能提高速度。
真正的瓶颈来自我的ng-repeat指令,产生的回流次数以及我在每次迭代中构建的DOM节点/观察者的数量。
有些消息来源建议创建一个自定义指令,该指令手动组装dom并一次性附加它。结果是回流非常小,没有观察者。缺点是非常大。没有更多的角色乐趣和许多不必要的工作。更重要的是,这些都没有提供足够大的速度来改善工作的合理性。
我最终发现,最好的速度提升来自强制每次ng-repeat迭代的硬件加速。如上所述,较新版本中的ng-animate指令使得这相对简单。
您将看到即时页面渲染,并有轻微的回流打嗝。 ng-cloak在这里没有帮助。由于动画请求,在重复渲染时页面不会被遮盖。然而,这些可以通过一些巧妙的乐趣得到相当好的表现。我实际上隐藏了ng-repeat,直到$ location改变,同时显示进度指示器,然后切换我的ng-show。这非常有效。
说完所有这些后,预编译模板应按如下方式完成。
1)当您的应用启动时,请为自己创建一个新缓存。请参阅http://docs-angularjs-org-dev.appspot.com/api/ng。$ cacheFactory
2)使用编译的模板填充此缓存。注入$ compile并在每个模板上调用它。编译返回一个函数,稍后您将调用该函数。根据需要在缓存中键入此功能。
3)创建一个自定义指令,该指令接受缓存键作为属性。在此指令中,查询编译缓存以获取正确的编译函数。根据当前作用域调用函数,并将生成的DOM附加到传递给指令的元素中。
4)Sorta win:)。
答案 2 :(得分:0)
如果您升级到Angular 1.1.5,则可以在ng-view标签上使用ng-animate属性。
我不是百分百肯定,但我认为它会进行一些DOM缓存以使转换更好地运行。您可以尝试在标记中添加ng-animate属性。这可能会照顾你。