31

I have a angular 2 application that has a class called User. This user has a attribute called deleted_at that is either null or contains a datetime, obviously the user is deleted if the deleted_at property isn't null. This is how my user.ts file looks:

User.ts

export class User { id: number; email: string; created_at: string; first_name: string; last_name: string; deleted_at: any; name() { if (this.deleted_at === null) { return this.first_name; } else { return 'DELETED'; } } } 

Now I expected that I could just call name in my template with a simple line:

{{ user.name }} 

This however returns nothing, how can you call certain functions in the angular 2 template? Or isn't this allowed?

Edit: to clear stuff up a bit, this is a class User that I am using in my component user-list.component.ts, multiple users are handled in this component.

0

2 Answers 2

22

Either you call the method like this:

{{user.name()}} // instead of {{user.name}} 

For this approach you need to be aware that you will lose the execution context (this). See this question for more details:

Or you define your method as a getter so you can use user.name in your template:

get name() { if (this.deleted_at === null) { return this.first_name; } else { return 'DELETED'; } } 
Sign up to request clarification or add additional context in comments.

9 Comments

Thanks for your answers, I'm still not there yet though. When I define the getter like you suggested I get a TS error that says: '=' expected, do you know if there is something wrong in the syntax?
Mum strange. See this plunkr: plnkr.co/edit/Twhqy3uKbvALwTrjJh0j?p=preview. It works for me. Any difference with what you tried?
Ah the typescript error was just a syntax problem. The main difference with your plunker and my example is that in my example I loop over a list of users in my template with: *ngFor="let user of users", and for each entry I call user.name. This returns an empty string, could that be because the template doesn't recognise that this is a User class object?
I think you wanted to include a link, but I can't see it!
shouldn't it be get name()?
|
1

If the template you are refering to is from your component above you can simple do {{ name() }}. In Angular 2 you dont have to refer to your component first to call methods as it was in Angular 1 the case. In case your class is just a model that you have declared in your componet, you have to get the reference to that model first and then call your method {{ user.name() }}. However, if your method is just a plain getter I would just access a public property instead of calling a method there.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.