Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/24.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
Javascript 如何在AngularJS中更改路线时防止视图重画_Javascript_Angularjs_Angular Routing_Angularjs View - Fatal编程技术网

Javascript 如何在AngularJS中更改路线时防止视图重画

Javascript 如何在AngularJS中更改路线时防止视图重画,javascript,angularjs,angular-routing,angularjs-view,Javascript,Angularjs,Angular Routing,Angularjs View,我正在制作一个web应用程序,用户可以在其中查看地图上的对象,按一个标记,然后转到一个包含信息的新视图。从这个角度来看,他们可以深入了解更多的信息 比如: /地图 /树/{treeid} /树/{treeid}/information/{informationid} 我知道在路由/状态之间遍历时如何保持实际的模型状态。问题是,当我返回浏览器历史记录时,我不想重新计算整个地图(包括标记和所有内容)。换句话说,我希望在进一步遍历时保持/map的渲染状态 这可以通过使用搜索参数而不是/map(即/

我正在制作一个web应用程序,用户可以在其中查看地图上的对象,按一个标记,然后转到一个包含信息的新视图。从这个角度来看,他们可以深入了解更多的信息

比如:

  • /地图
  • /树/{treeid}
  • /树/{treeid}/information/{informationid}
我知道在路由/状态之间遍历时如何保持实际的模型状态。问题是,当我返回浏览器历史记录时,我不想重新计算整个地图(包括标记和所有内容)。换句话说,我希望在进一步遍历时保持/map的渲染状态

这可以通过使用搜索参数而不是/map(即/map?treeid=10)上的路由,禁用搜索时重新加载,并在map对象上执行ng hide=“treeid”,在tree info对象上执行ng show来轻松实现

我的问题是,是否有一种更好、更合适的方法来解决这个问题


提前感谢。

您可以创建一个专用服务来存储数据。由于服务是单例的,数据将在视图和控制器之间共享。大概是这样的:

angular.module('myApp').factory('GlobalService', [
    function() {
        var _this = this;
        _this._data = {
            user: window.user,
            authenticated: !! window.user
        };

        return _this._data;
    }
]); 


angular.module('myApp').controller('FooController',
    ['$scope', 'GlobalService',
    function ($scope, GlobalService) {
    $scope.global = GlobalService;
    $scope.global.bar = someData;
    ...
]);

这看起来像是一个有用的读物:。它详细介绍了在呈现大型/复杂数据结构时应避免的建议和陷阱。

解决“重新计算整个地图”问题的一种方法是在与
ng视图相同的级别绘制谷歌地图,并将其移出视图以隐藏它

下面是一个plunker,说明了这将如何工作:


请注意,我在隐藏时故意将地图的一部分留在屏幕上,以显示它不会在更改路线时重新绘制。

但这只允许我保留模型状态,而不是视图的实际渲染状态,对吗?无论模型是否准备就绪,渲染一个(例如)带有数千个标记的自定义谷歌地图(以正确位置为中心)都需要一些时间。因此,不是在路线更改时从ng视图中删除内容,而是可以将其隐藏,还是这是一种不好的做法或不可能的做法?您是对的,它只会保留模型。对于视图的渲染状态,可以尝试使用angular.element将其与其父级分离,并在离开视图之前将其附着到ngview外部的dom点,然后在进入视图时将其重新附着到ngview内容。这是一个疯狂的猜测,我不知道对Angular内部的影响。谢谢你的输入。我接受了marcoseu的回答,因为它以一种简单的方式解决了这个问题,并且没有对系统的其他部分产生不良影响。这是一个伟大的想法,我没有想到。它真的解决了问题,而不必做一些“肮脏”的解决方案。也谢谢你的好例子!我建议您将问题的标题改为“如何防止在AngularJS中更改路线时重新绘制Google地图”这类内容。这本书读得不错,但并没有真正涉及到保持元素渲染状态的主题。谢谢你!