This computed property lastSeenString
used to be working for me:
export class User {
public lastSeen?: Date;
private _lastSeenString?:string = "";
get lastSeenString():string {
return Time.timeSince(this.lastSeen);
}
}
But now lastSeenString
returns ""
. The return
statement in the getter is never called. How come? lastSeen
is populated.
client:
it('Displays the user\'s "last seen"', () => {
component.user.lastSeen = new Date();
fixture.detectChanges();
expect(component.user.lastSeenString).toBe("less than a minute ago");
expect(page.lastSeen.innerText).toBe("last seen less than a minute ago");
});
My typescript compiles to es5
. Why does code inside the getter not execute?
Time class which is supposed to get executed but doesn't:
export class Time {
public static timeSince(date: Date) {
let start = +new Date();
let elapsed = +new Date() - start;
var seconds = Math.floor((elapsed) / 1000);
// var seconds = Math.floor((new Date() - +date) / 1000);
//var seconds = Math.floor(((new Date().getTime()/1000) - +date))
var interval = Math.floor(seconds / 31536000);
if (interval > 1) {
return interval + " years";
}
interval = Math.floor(seconds / 2592000);
if (interval > 1) {
return interval + " months";
}
interval = Math.floor(seconds / 86400);
if (interval > 1) {
return interval + " days";
}
interval = Math.floor(seconds / 3600);
if (interval > 1) {
return interval + " hours";
}
interval = Math.floor(seconds / 60);
if (interval > 1) {
return interval + " minutes";
}
return "less than a minute ago";
}
}
actual implementation of the User class:
export var SERENA: User = {
id: 1,
lastSeenString: "",
lastSeen: new Date("October 13, 2016 11:13:00"),
badges: ["active User", "helper"],
memberSince: new Date("October 13, 2014")
}
I see the implementation has lastSeenString = ""
, however I thought that would trigger the getter rather than just return ""
.
Update: I'm pretty sure it must be to do with just exporting that JSON object and calling it a User
. I think I must have to new it up.