阻止Angularjs在路由更改时呈现模板

时间:2013-10-22 14:34:31

标签: angularjs

我使用角度路线进行应用导航,使用 ng-view 在路线更改时渲染模板。

但在某种情况下,我想调用我的另一个控制器并将模板单独渲染为 ng-include (因为我们不会使用超过一个ng-view而且我不会我想使用ui-route)。

执行此操作时,我不希望现有视图发生变化,但需要更改路径。


更新:示例实际需要的内容 -
我正在路线 abc xyz 模板和控制器 ctrl
然后进行一些搜索并填充一些数据 点击链接后(在模板 xyz 中)我需要使用模板 xyz1 (如叠加层)将路径更改为 abc1 但必须重新设置以前的所有观点(即 xyz 模板和已填充的数据)。

由于

2 个答案:

答案 0 :(得分:1)

将您的视图绑定到控制器中的作用域变量...这使您比ng-view更灵活,并且基本上充当拦截器。

这样,你可以听:

$scope.$on('$routeUpdate', function(event, route){
  if(condition){
    $scope.template = 'mytemplate.html';
  }
});

并围绕您的观点包装逻辑,以确定哪一个符合您的条件。

<div ng-include="'template'"></div>

答案 1 :(得分:0)

您可以在路线中添加其他参数,然后可以将其作为routeparams进行访问。您还可以对多个视图使用相同的模板。

你可以把它结合起来做你想要的(假设我理解正确)。将两条路线指向同一页面,并为第二条路线提供额外的变量,您可以使用该路线显示其他内容(通过ng-include)。您在路径中设置的变量可以是模板URL,然后您可以在ng-include语句中使用。

一个例子:

  .when('/mypage', {
    templateUrl: 'mypage.html'
  })
  .when('/myotherpage', {
    templateUrl: 'mypage.html',
    to_be_inclyded: 'myotherpage.html'
  })

编辑:您还可以在页面上拥有多个控制器(即使您直接在路径中设置了控制器)。因此,您可以为包含的内容设置单独的控制器。

<div ng-controller="MyController">
  <!-- Page content of the original view goes here. -->
  <!-- Note that you could have specified this controller in the route instead. -->
  ...
  ...
  ...

  <!-- Here we put the include, and we can simply give it a new controller -->
  <div ng-include="{{to_be_included}}" ng-controller="MyOtherController"></div>
</div>

事实上,你应该总是这样做。没有理由尝试将包含多个部分的整个页面填充到一个控制器中。而是为每个部分/功能提供自己的控制器,这将使您的代码更简单,更容易理解。


再次编辑:我将完整保留以上内容,但是您提供的示例我认为我更清楚地看到了问题。最大的问题不是您需要加载相同的视图,而是当路由更改时控制器将重新加载并且您丢失所做的所有更改。因此,用户在视图中执行的任何搜索或其他操作都将被清除。

默认的$ route将在更改url时始终(并按设计)重新加载控制器。要做你想做的事情,我会查看UI路由器项目(https://github.com/angular-ui/ui-router)。它是使用默认$ route的替代方法,它可以让您更好地控制确切的行为。我没有尝试过,所以我不知道是否支持这个确切的用例,但看起来很有希望。

如果您不想这样做或者它不起作用(我还没有尝试过使用它),那么您可能能够解决问题。我知道另外两种方法。

  1. 使用get-parameters而不是更改url。而不是从/ mypage转到/ myotherpage,你从/ mypage转到/ mypage?foo = bar。有一个名为reloadOnSearch的设置可以防止路由在执行此操作时重新加载,因此如果您对那些不那么漂亮的网址没问题,那么您可以使用它。
  2. 接受重新加载但保存路由之间的数据。您可以将数据存储在服务(Angularjs, passing scope between routes)中,每次基本控制器运行时,都可以导入该数据,从而保持其在路由之间的状态。这并不像没有重新加载一样干净,并且可能会导致视图中出现一些闪烁(你必须尝试),但这很容易做到。