我正在使用Cordova和AngularJS制作一个移动应用程序。目前,我已经安装了ui-router进行路由,但是我愿意接受其他任何路由选择。
我的愿望:我想缓存某些绑定了参数的视图。换句话说,我想缓存路径(或页面)。
情况示例:假设我们看到某个仪表板页面,单击某些书的封面,该书的封面会重定向到path
book/2
。该路径是第一次加载到应用程序中。路由器从重定向HomeController
到BooksController
(无论名称如何)。现在,BooksController
加载给定数据$stateParams
(书ID
= 2)并创建视图,其中填充了有关所选书的信息。
在这种情况下我想要什么:
实际上,最好根据路径来缓存我访问的所有内容。预加载也很酷。
原因:性能。当我打开一些书单时,我希望它能快速显示。每次创建视图时,页面更改的动画看起来都很糟糕(不平滑)。
任何帮助,将不胜感激。
首先,由于我认为这对于许多移动HTML应用程序程序员来说是一个普遍的问题,因此我想整理一些信息:
ng-bind
,ng-repeat
依此类推。我有一些半解决方案,但我会对自己的要求严格。
将所有视图放入一个文件中(我可以使用gulp builder来完成)并使用ng- show
。那是最简单的解决方案,我不相信任何了解AngularJS的人都不会考虑它。
一个 不错的技巧 (来自@DmitriZaitsev)是创建一个辅助函数,以基于当前位置路径显示/隐藏元素。
优点:
缺点:
使用ui-router-extras中的粘滞状态和未来状态,非常棒。
优点:
ui-router
。book1
,book2
但我不知道book/1
和book/2
缺点:
(view, parameters)
。除此之外,它看起来很酷。这正是我必须为我的网站33hotels.com解决的问题。您可以对其进行检查并使用“过滤器”和“过滤器列表”选项卡(对应于不同的路线)进行播放,然后立即查看视图,而不会出现任何延迟!
我是怎么做的?这个想法非常简单-摆脱路由器!
为什么?因为路由器的工作方式是它会在 每次更改单个Route* 时 重新编译 View 。是的,Angular会缓存 模板,
但不会缓存填充了数据的已编译视图。即使数据不变!结果,当我过去使用路由器时,交换机总是感觉迟钝且无反应。每次我看到烦人的延迟,那都是一秒钟的时间,但仍然很明显。
* __
现在我使用的解决方案?不要重新编译您的视图!始终将它们保存在您的DOM中!然后根据路线使用ng-hide
/ ng-show
隐藏/显示它们:
<div ng-show="routeIs('/dashboard')">
<-- Your template for Dashboard -->
</div>
<div ng-show="routeIs('/book')">
<-- Your template for Book -->
</div>
然后routeIs(string)
在您的内部创建一个函数Controller
以测试是否$location.path()
匹配string
,或者以string
我正在使用的函数开头。这样,我仍然对所有路径都拥有自己的视图/book/2
。这是我正在使用的功能:
$scope.routeBegins = function () {
return _.some(arguments, function (string) {
return 0 === $location.path().indexOf(string);
});
};
因此,无需精通缓存-只需将其保存在DOM中即可。它将为您缓存您的视图!
最好的部分是-每当更改数据时,Angular都会立即更新DOM内部的所有视图,甚至是隐藏的视图!
为什么这么棒?因为,作为用户,我不需要等待所有解析和编译的时间,就可以看到结果。我想单击选项卡,然后立即查看我的结果!为什么网站要等我单击它, 然后
在我等待时开始所有重新编译?尤其是在以前很容易做到这一点的时候,我的计算机处于空闲状态。
有什么缺点吗?我唯一能想到的就是用更多DOM元素加载内存。但是,与所有JS,CSS和图像相比,我的视图的实际字节大小可以忽略不计。
另一个可能但可以避免的缺点是隐藏视图的重新编译成本。在这里,您可以变得聪明,并避免依赖于当前路线的繁琐计算。另外,您不必重新编译整个View,而仅重新编译受数据更改影响的部分,这也降低了计算成本。
我发现每个人都在使用Routes的过程非常引人注目,并且似乎完全没有意识到(或无知)此问题。
我很抱歉,如果这已经涵盖,但我做了广泛的搜索,没有找到答案。 首先,我使用刀片。当我在本地更新视图时,页面会正确更新和显示。但是,当我将文件上传到我的托管服务器时,我看不到这些更改。我已经等了24小时了,什么都没有。 起初我以为是我的提供者从服务器缓存,但我禁用了该功能。。当我从服务器上的app/storage/framework/views中删除文件时,新视图将正确显示。所以,这显然是一个拉威尔
从块生成代码时,经常会发现需要多次使用子块的返回值。考虑一个值块,该值块查找并返回列表的最后一个元素。该块本身将有一个输入(一个列表),并返回一个值(最后一个元素)。这是JavaScript的生成器: var code = arg0 + '[' + arg0 + '.length - 1]'; 如果arg0是变量名,则此生成器返回完全可接受的JavaScript: aList[aList.leng
问题内容: 该真棒。但是对于我的博客,我希望将页面保留在缓存中,直到有人发表评论。这听起来像是一个好主意,因为人们很少评论,因此将页面保留在内存缓存中,而没人评论会很好。我以为有人以前一定有这个问题?这与每个URL的缓存不同。 因此,我正在考虑的解决方案是: 然后,我将保留用于博客视图的所有缓存键的列表,然后使“博客”缓存空间过期。但是我对Django并没有超级的经验,所以我想知道是否有人知道这样
我注意到Laravel缓存视图存储在但是没有清除视图缓存。因此,我必须手动删除上述文件夹中的文件。 另外,如何禁用视图缓存?
问题内容: 我正在尝试从烧瓶视图获取url参数: 如何从视图中获取? 问题答案: 你可以使用以下方法检索查询字符串变量 要么 你要接收的查询字符串中的变量在哪里。
问题内容: 我开发了一个HTML 5应用程序,并具有加载用户评论的视图。它是递归的:任何注释都可以具有可单击的子注释,这些子注释正在同一视图中加载并使用相同的控制器。 一切都好。但是,当我想返回时,评论会再次加载,而我的位置和子评论也会丢失。 返回时可以保存视图的状态吗?我想我可以使用某种技巧,例如:每当我单击子注释并隐藏上一个视图时,都可以追加一个新视图。但是我不知道该怎么做。 问题答案: 是的