我使用角度路线进行应用导航,使用 ng-view 在路线更改时渲染模板。
但在某种情况下,我想调用我的另一个控制器并将模板单独渲染为 ng-include (因为我们不会使用超过一个ng-view而且我不会我想使用ui-route)。
执行此操作时,我不希望现有视图发生变化,但需要更改路径。
更新:示例实际需要的内容 -
我正在路线 abc , xyz 模板和控制器 ctrl 。
然后进行一些搜索并填充一些数据
点击链接后(在模板 xyz 中)我需要使用模板 xyz1 (如叠加层)将路径更改为 abc1 但必须重新设置以前的所有观点(即 xyz 模板和已填充的数据)。
由于
答案 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的替代方法,它可以让您更好地控制确切的行为。我没有尝试过,所以我不知道是否支持这个确切的用例,但看起来很有希望。
如果您不想这样做或者它不起作用(我还没有尝试过使用它),那么您可能能够解决问题。我知道另外两种方法。