【问题标题】:How to get back to previous route state in angularjs如何在angularjs中恢复到以前的路由状态
【发布时间】:2013-01-02 13:20:25
【问题描述】:

我有一个带有几条路线的 Angular 应用程序。其中一个是我在viewContentLoaded 上激活的jquery 插件(bxslider)。 如果我走另一条路线然后回来,我在路线视图上所做的所有 jQuery 操作都会被清除,我需要重新做一遍吗?

有没有办法回到上一个状态的上一个路由(查询插件已经呈现?

angTestApp.controller('MyRouteCtrl', function($scope, $timeout) {
  $scope.readyFunction = function(e) {
    $timeout(function(){
      $('.slider').bxSlider();
    });
//

 }
$scope.$on('$viewContentLoaded', $scope.readyFunction);
});

每次调用路由 MyRoute 时,滑块都会重新渲染,如果我之前已经在该 URL 中并且我目前仍在应用程序中(但在不同的路由中),有什么方法可以获得渲染的版本? (毕竟它是一个哈希标签视图,浏览器不应该在应用程序内刷新)

【问题讨论】:

  • 向我们展示相关代码。
  • 在上面添加了代码示例
  • 这样做的方法是将状态保存在控制器中,并像往常一样使用控制器构建页面。
  • 嗨,Gav,你是如何解决 bxSlider 的问题的?我有同样的问题,我被卡住了,因为我对图像使用了 ng-repeat,并且滑块成功地应用于包装器和元素,但不适用于图像。你能告诉我你的代码吗?
  • 我的代码散落在各处 - 创建一个 jsfiddle,我会检查一下。

标签: jquery angularjs


【解决方案1】:

如果我去另一条路线然后回来,我在路线视图上所做的所有 jQuery 操作都被清除了,我需要重新做一遍吗?

是的:

每次当前路由变化时,包含的视图都会根据$route服务的配置而变化。 -- ng-view docs

.

有没有办法回到上一个状态的上一个路由(查询插件已经呈现?

正常的 ng-view 和路由没有。当您第一次使用 bxSlider 离开路由时,ng-view 内的 DOM 元素将替换为与新视图关联的 DOM 元素。

也许当您使用 bxSlider 离开视图时,您可以将其“jQuery 移动”到页面某处的某个隐藏的 DOM 元素(例如,某些页脚区域),然后在您返回路线时将其移回。我认为底线是你必须自己在某个地方“缓存”它,然后自己恢复它。将代码和数据包装在 Angular 服务中可能是最好的。

【讨论】:

  • 谢谢,我会试试,让你知道
  • 尝试此方法时会发生奇怪的事情 - DOM 进入以前的状态,但滑块不再响应 - 我不确定这种行为是否适用于 Angular - 例如,您可以重现我我只是使用控制台-> var clonedSlider = $('.slider').clone(); $('.slider').detach(); $('.sliderContainer').html(clonedSlider);
  • 只是在这里猜测:“绑定到原始元素的任何事件处理程序都不会复制到克隆。可选的 withDataAndEvents 参数允许我们更改此行为,而是复制所有事件处理程序同样,绑定到元素的新副本。” -- api.jquery.com/clone
  • 不错的一个添加 TRUE 到 clone() 修复它。我偷偷地认为这感觉像是一种 hack - 我希望有一个 ng-view 或 route 属性来告诉 angular 缓存视图状态,而不是我试图操纵 DOM
  • 嗯,ng-view 只是一个简单的页面/视图转换器。如果您必须仅使用 jQuery 来实现您想要的操作,您可能会有一堆“页面”div,您可以根据路由或选项卡单击来隐藏/显示它们。如果你愿意,你可以用 Angular 来做到这一点,而不是使用 ng-view (这样你就不必移动/克隆东西了)。主页有一个很好的选项卡窗格示例,它使用指令和隐藏/显示而不是 ng-view。
猜你喜欢
  • 2021-05-22
  • 2017-12-14
  • 2017-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-21
  • 1970-01-01
  • 2011-06-27
相关资源
最近更新 更多