Reputation: 2017
I started with Angular 1.5 component recently.
I am having various pages in my application. So I decided to create a <my-title>
component which am using inside <my-header>
component.
As you see in navbar I have First, Second as navigation links. In my application there will be more parent child combinations.
I want to set title of each page by two way.
<my-title>Home</my-title>
(see 1.html or 2.html)
(Manuel's answer satisfies this Scenario) vm.title = "current page title"
(Accepted Answer Satisfies This Scenario Only)I think any one thing can be done from above two options. There are two answers by different person for option 1(Deblaton) and option 2(Manuel). Both answers satisfies respective scenarios. I accepted who answered first correctly.
Updated: If you see file "1.html" on plunker. I am trying to set <my-title> First page</my-title>
. but that is not working. My key idea is that developer will give <my-title>Current Page Title</my-title>
on partial and it will be shown as per current page when he navigates across.
Please keep in mind I will be exposing only <my-title>
to partial and controller.
<my-header>
will be at one place only. Only Title will be changed.
If there are some new pages navigation links will be added to <my-header>
.
There is lot of code to copy-paste here. Please visit this PLUNKER.
module.component('myFirstApp', {
templateUrl: "mainview.html",
$routeConfig: [
{path: '/', redirectTo: ['/First'] },
{path: '/first', name: 'First', component: 'firstComponent'},
{path: '/second', name: 'Second', component: 'secondComponent'}
]
})
module.component('firstComponent', {
templateUrl: "1.html"
});
module.component('secondComponent', {
templateUrl: "2.html"
});
module.component('myTitle', {
template: '<h1>{{model.title}}</h1>'
});
module.component('myHeader', {
templateUrl: "my-header.html"
});
Upvotes: 3
Views: 1961
Reputation: 131
You are missing a couple of things in your code.
Component example:
module.component('myTitle', {
template: '<h1>{{model.title}}</h1>',
controllerAs: 'model',
bindings: {
title: '<'
}
});
Use example:
<my-title title="'I am First'"></my-title>
Note the quotation marks inside the double quotation marks in "'I am First'". You need both because you are passing a string as parameter.
In order to change the title in the header I created a service to allow the communication from components under ng-outlet and outer components because you can not pass data as bindings via routes.
Your Plunker with the changes: https://plnkr.co/edit/ScpJYQItsMQlyd1Eacyi?p=preview
Upvotes: 1
Reputation: 11398
To me, using component routing, it looks like a good idea to use a controller for handling your title. (with ui-router, I would have used the resolve option).
I decided to inject $rootScope, and use it for sharing title value. You can also do it with a service.
so, the component :
module.component('firstComponent', {
templateUrl: "1.html",
controller: ["$rootScope", function($rootScope){
$rootScope.appVars = $rootScope.appVars || {};
$rootScope.appVars.title = "Title from Page 1";
}]
});
and the directive :
module.component('myTitle', {
template: '<h1>{{$root.appVars.title}}</h1>'
});
Here is your updated plnkr : https://plnkr.co/edit/6PCfznxsJzCPQtBm2oyN?p=preview
Upvotes: 1