기본 제공 라우팅 대신 ui-router를 사용하도록 AngularJS 기반 앱을 마이그레이션하고 있습니다. 아래와 같이 구성했습니다.
.config(function($stateProvider, $urlRouterProvider) {
$urlRouterProvider.otherwise('/home');
$stateProvider
.state('home', {
url: '/home',
templateUrl : 'views/home.html',
data : { pageTitle: 'Home' }
})
.state('about', {
url: '/about',
templateUrl : 'views/about.html',
data : { pageTitle: 'About' }
})
});
pageTitle 변수를 사용하여 페이지 제목을 동적으로 설정하려면 어떻게해야합니까? 내장 된 라우팅을 사용하여
$rootScope.$on("$routeChangeSuccess", function(currentRoute, previousRoute){
$rootScope.pageTitle = $route.current.data.pageTitle;
});
그런 다음 아래와 같이 HTML에서 변수를 바인딩하십시오.
<title ng-bind="$root.pageTitle"></title>
ui-router를 사용하여 연결할 수있는 유사한 이벤트가 있습니까? ‘onEnter’및 ‘onExit’함수가 있지만 각 상태에 묶여있는 것으로 보이며 각 상태에 대해 $ rootScope 변수를 설정하는 코드를 반복해야합니다.
답변
사용 $stateChangeSuccess
.
지시문에 넣을 수 있습니다.
app.directive('updateTitle', ['$rootScope', '$timeout',
function($rootScope, $timeout) {
return {
link: function(scope, element) {
var listener = function(event, toState) {
var title = 'Default Title';
if (toState.data && toState.data.pageTitle) title = toState.data.pageTitle;
$timeout(function() {
element.text(title);
}, 0, false);
};
$rootScope.$on('$stateChangeSuccess', listener);
}
};
}
]);
과:
<title update-title></title>
데모 : http://run.plnkr.co/8tqvzlCw62Tl7t4j/#/home
코드 : http://plnkr.co/edit/XO6RyBPURQFPodoFdYgX?p=preview
심지어와 $stateChangeSuccess
이 $timeout
역사는 정확해야 할 필요가있다, 적어도 나 자신을 테스트 한 때.
편집 : 2014 년 11 월 24 일-선언적 접근 방식 :
app.directive('title', ['$rootScope', '$timeout',
function($rootScope, $timeout) {
return {
link: function() {
var listener = function(event, toState) {
$timeout(function() {
$rootScope.title = (toState.data && toState.data.pageTitle)
? toState.data.pageTitle
: 'Default title';
});
};
$rootScope.$on('$stateChangeSuccess', listener);
}
};
}
]);
과:
<title>{{title}}</title>
데모 : http://run.plnkr.co/d4s3qBikieq8egX7/#/credits
코드 : http://plnkr.co/edit/NpzQsxYGofswWQUBGthR?p=preview
답변
이미 여기에 대부분의 답변을 결합하여이를 수행하는 또 다른 방법이 있습니다. 이미 답변을 받았지만 ui-router를 사용하여 페이지 제목을 동적으로 변경하는 방법을 보여주고 싶었습니다.
ui-router 샘플 app을 살펴보면 각 .run 블록을 사용 하여 $ state 변수를 $ rootScope에 추가합니다.
// It's very handy to add references to $state and $stateParams to the $rootScope
// so that you can access them from any scope within your applications.
// For example, <li ng-class="{ active: $state.includes('contacts.list') }">
// will set the <li> to active whenever 'contacts.list' or one of its
// decendents is active.
.run([ '$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}])
이렇게 정의하면 게시했지만 정의 된 상태를 사용하도록 수정 한 내용으로 페이지 제목을 쉽게 동적으로 업데이트 할 수 있습니다.
동일한 방식으로 상태를 설정합니다.
.state('home', {
url: '/home',
templateUrl : 'views/home.html',
data : { pageTitle: 'Home' }
})
하지만 html을 조금 수정하세요 …
<title ng-bind="$state.current.data.pageTitle"></title>
이것이 이전의 답변보다 낫다고 말할 수는 없지만 이해하고 구현하기가 더 쉬웠습니다. 이것이 누군가를 돕기를 바랍니다!
답변
볼록 UI 라우터 타이틀 플러그인은 쉽게 페이지 제목 업데이트하게 정적 또는 동적 의 현재 상태에 기초하여 값. 브라우저 기록에서도 올바르게 작동합니다.
답변
$stateChangeSuccess
이제 UI-Router 1.x에서 더 이상 사용되지 않으며 기본적으로 비활성화됩니다. 이제 새 $transition
서비스 를 사용해야합니다 .
$transition
작동 방식 을 이해하면 해결책은 그리 어렵지 않습니다 . 모든 것을 이해하는 데 @troig의 도움 을 받았습니다 . 제목을 업데이트하기 위해 제가 생각 해낸 것입니다.
이것을 Angular 1.6 응용 프로그램에 넣으십시오. ECMAScript 6 구문을 사용하고 있습니다. 그렇지 않은 경우 예를 들어으로 변경 let
해야 var
합니다.
.run(function($transitions, $window) {
$transitions.onSuccess({}, (transition) => {
let title = transition.to().title;
if (title) {
if (title instanceof Function) {
title = title.call(transition.to(), transition.params());
}
$window.document.title = title;
}
});
그런 다음 title
상태에 문자열을 추가 하십시오.
$stateProvider.state({
name: "foo",
url: "/foo",
template: "<foo-widget layout='row'/>",
title: "Foo Page""
});
그러면 제목에 “Foo Page”라는 단어가 표시됩니다. (상태에 제목이 없으면 페이지 제목이 업데이트되지 않습니다. 상태가 제목을 나타내지 않는 경우 기본 제목을 제공하도록 위의 코드를 업데이트하는 것은 간단합니다.)
이 코드를 사용하면 title
. 는 this
상태 자체 될 함수를 호출하는 데 사용하고, 하나의 인자는이 예와 같이, 상태 변수가 될 것이다 :
$stateProvider.state({
name: "bar",
url: "/bar/{code}",
template: "<bar-widget code='{{code}}' layout='row'/>",
title: function(params) {
return `Bar Code ${params.code}`;
}
});
/bar/code/123
페이지 제목으로 “바코드 123″을 표시 하는 URL 경로의 경우 . ECMAScript 6 구문을 사용하여 문자열 형식을 지정하고 params.code
.
시간이있는 사람이 이와 같은 것을 지시문에 넣어 모든 사람이 사용할 수 있도록 게시하면 좋을 것입니다.
답변
$ state를 $ rootscope에 연결하여 앱 어디에서나 사용할 수 있습니다.
app.run(['$rootScope', '$state', '$stateParams',
function ($rootScope, $state, $stateParams) {
// It's very handy to add references to $state and $stateParams to the $rootScope
// so that you can access them from any scope within your applications.For example,
// <li ng-class="{ active: $state.includes('contacts.list') }"> will set the <li>
// to active whenever 'contacts.list' or one of its decendents is active.
$rootScope.$state = $state;
$rootScope.$stateParams = $stateParams;
}
]
)
<title ng-bind="$state.current.name + ' - ui-router'">about - ui-router</title>
답변
나는 발견 이 방법은 정말 쉽습니다 :
.state('app.staff.client', {
url: '/client/mine',
title: 'My Clients'})
다음과 같이 내 HTML에서 :
<h3>{{ $state.current.title }}</h3>
답변
window.document.title을 업데이트하십시오.
.state('login', {
url: '/login',
templateUrl: "/Login",
controller: "loginCtrl",
onEnter: function($window){$window.document.title = "App Login"; }
})
이렇게하면 ‘ng-app’이 HTML 태그 위로 이동할 필요가 없으며 본문 또는 아래에 머물 수 있습니다.