In the following mock-up I use a signal as an input to a component. It works. But I am wondering if this is the proper use of a signal. Seems....weird.
The follwing is a service that maintains a list of My Friends:
import {
Injectable,
signal
} from '@angular/core';
export interface MyFriend {
name: string;
age: number;
}
@Injectable({
providedIn: 'root'
})
export class MyFriendsService {
myFriends = signal < MyFriend[] > ([{
name: 'Bob',
age: 34,
},
{
name: 'Julie',
age: 30,
},
{
name: 'Martin',
age: 25,
},
]);
}
The folowing is a Friend Detail Component that shows the detail of a particular friend:
import {
Component,
Input,
computed,
signal
} from '@angular/core';
import {
MyFriend,
MyFriendsService
} from './my-friends.service';
@Component({
selector: 'app-friend-detail',
templateUrl: './friend-detail-component.html',
})
export class FriendDetailComponent {
@Input() name = signal('Bob');
friendDetail = computed < MyFriend > (() => {
const friend = this.myFriendsService
.myFriends()
.filter((friend) => friend.name === this.name());
if (friend.length > 0) {
return friend[0];
}
return {
name: '',
age: 0,
};
});
constructor(private myFriendsService: MyFriendsService) {}
The following component simply uses the FriendDetailComponent:
import {
Component,
signal
} from '@angular/core';
@Component({
selector: 'app-some-component',
template: `<app-friend-detail [name]="selectedName"></app-friend-detail>`,
})
export class SomeComponent {
selectedName = signal < string > ('Julie');
}
As I said, this WORKS. But...is this a proper way to be using a signal in angular?
FYI, I realize that the FriendDetailComponent should be more "dumb" and just accept the input of the FriendDetail info (it need not use signals)...but I did this mock-up as a way to explain a pattern I fell into within the context of a more complex situation.
[EDIT] since 17.1 you can now use a signal as input. There is no need for
@Input()
anymore:Previous answer below:
It's not yet ready, you can however convert a regular input into a signal one using this helper:
usage is as follows: