您可以在路由中添加其他参数,然后可以将其作为路由参数访问。您还可以对多个视图使用相同的模板。
您可以将其结合起来做您想做的事(假设我理解正确)。将两条路由指向同一个页面,并为第二条路由提供一个额外的变量,您可以使用它来显示额外的内容(通过 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>
事实上,您几乎应该一直这样做。没有理由尝试将包含多个部分的整个页面塞进一个控制器中。而是为每个部分/功能提供自己的控制器,这将使您的代码更简单,更容易遵循。
再次编辑:为了完整起见,我将保留上述内容,但对于您提供的示例,我认为我更清楚地看到了问题。最大的问题不是您需要加载相同的视图,而是当路由更改时控制器将重新加载并且您会丢失所做的所有更改。因此,用户在视图中执行的任何搜索或其他操作都将被清除。
在更改 url 时,默认的 $route 将始终(并且按照设计)重新加载控制器。要做你想做的事,我会查看 UI-router 项目 (https://github.com/angular-ui/ui-router)。它是使用默认 $route 的替代方法,它使您可以更好地控制确切的行为。我还没有尝试过,所以我不知道是否支持这个确切的用例,但它看起来很有希望。
如果您不想这样做或者它不起作用(我没有尝试使用它),那么您也许可以解决这个问题。我知道另外两种方法。
- 使用 get-parameters 而不是更改 url。不是从 /mypage 到 /myotherpage,而是从 /mypage 到 /mypage?foo=bar。有一个名为 reloadOnSearch 的设置可防止在执行此操作时重新加载路由,因此如果您对不那么漂亮的 url 没问题,那么您可以使用它。
- 接受重新加载但保存路由之间的数据。您可以将数据存储在服务 (Angularjs, passing scope between routes) 中,并且每次基本控制器运行时,它都可以导入该数据,从而在路由之间保持其状态。这不像根本不重新加载那样干净,并且可能会导致您的视图出现一些闪烁(您必须尝试),但它很容易做到。