В AngularJS я могу использовать текущий маршрут в ngSwitch за пределами ngView
Я пытаюсь изменить заголовок страницы в зависимости от текущего представления. Заголовок находится за пределами ngView. Это возможно, или мне нужно поместить заголовок внутри представления?
Мой код выглядит примерно так:
<div id="header">
<div ng-switch on="pagename">
<div ng-switch-when="home">Welcome!</div>
<div ng-switch-when="product-list">Our products</div>
<div ng-switch-when="contact">Contact us</div>
</div>
(a lot of unrelated code goes here)
</div>
<div id="content>
<div ng-view></div>
</div>
4 ответа
Дайте каждому маршруту имя, когда вы его определяете. Затем введите $route в контроллер, а затем опубликуйте его в текущую область. Затем вы можете привязать ng-переключатель к $route.current.name
Вы могли бы ввести $location
обслуживание и проверка $location.path()
, http://docs.angularjs.org/api/ng.%24location
JS:
function Ctrl($scope, $location) {
$scope.pagename = function() { return $location.path(); };
};
HTML:
<div id="header">
<div ng-switch on="pagename()">
<div ng-switch-when="/home">Welcome!</div>
<div ng-switch-when="/product-list">Our products</div>
<div ng-switch-when="/contact">Contact us</div>
</div>
</div>
Кажется, это будут разные контроллеры для заголовка и контента. Лучший способ связи между контроллерами - сервис. Другой способ - события. Смотри Войта ответ.
Хороший подход для решения этой проблемы может заключаться в том, чтобы ввести $ route в ваш контроллер, а затем использовать его для получения текущего имени маршрута.
app.controller('YourController', function($scope, $route){
$scope.pagename = $route.current.$$route.name;
});
И вы должны назвать свои маршруты следующим образом:
app.config(['$routeProvider',
function($routeProvider) {
$routeProvider.
when('/product-list', {
templateUrl: 'views/product-list.html',
controller: 'ProductsController',
name: 'product-list'
}).
when('/home', {
templateUrl: 'views/home.html',
controller: 'HomeController',
name: 'home'
}).
otherwise({
redirectTo: '/'
});
}]);
Поэтому, когда вы загружаете маршрут, контроллер читает текущее имя маршрута и передает его представлению в вашей переменной pagename. Затем вид поднимет его и отобразит правильный вид, который вам нужен.
Надеюсь, поможет:)