Я думал, что он сделал больше смысла, чтобы создать таймер как службы, так что я могу иметь больше гибкости при создании своих взглядов (использовать возвращаемый модель времени, однако вы хотите в своих компонентах). Он создает новый наблюдаемый при подписке, поэтому каждый абонент получает свое собственное наблюдение. Короче говоря, вы можете создать столько таймеров одновременно с этой услугой, сколько хотите. Не забудьте включить эту службу в массив поставщика AppModule, чтобы вы могли использовать ее в своем приложении.
Услуги:
import { Injectable } from '@angular/core';
import {Observable} from 'rxjs/Observable';
import 'rxjs/add/observable/defer';
import 'rxjs/add/observable/interval';
import 'rxjs/add/operator/map';
export interface Time {
days: number;
hours: number;
minutes: number;
seconds: number;
}
@Injectable()
export class TimerService {
constructor() { }
private createTimeObject(date: Date): Time {
const now = new Date().getTime();
const distance = date.getTime() - now;
let time: Time = {days: 0, hours: 0, minutes: 0, seconds: 0};
time.days = Math.floor(distance/(1000 * 60 * 60 * 24));
time.hours = Math.floor((distance % (1000 * 60 * 60 * 24))/(1000 * 60 * 60));
time.minutes = Math.floor((distance % (1000 * 60 * 60))/(1000 * 60));
time.seconds = Math.floor((distance % (1000 * 60))/1000);
return time;
}
timer(date: Date): Observable<Time> {
return Observable.interval(1000)
.map(() => this.createTimeObject(date))
}
}
Теперь использовать его в компоненте:
import {Component, OnInit} from '@angular/core';
import {Time, TimerService} from '../timer.service';
@Component({
selector: 'app-timer',
template: `
<ng-container *ngIf="time1$ | async as time1"
<pre>{{time1.days}}days {{time1.hours}}hours {{time1.minutes}} minutes {{time1.seconds}}seconds<pre>
<br>
<ng-container>
<ng-container *ngIf="time2$ | async as time2"
<pre>{{time2.days}}days {{time2.hours}}hours {{time2.minutes}} minutes {{time2.seconds}}seconds<pre>
<br>
<ng-container>
`
})
export class TimerComponent implements OnInit {
time1$: Observable<Time>;
time2$: Observable<Time>;
constructor(private timerService: TimerService) {}
ngOnInit() {
this.time1$ = this.timerService.timer(new Date('June 4, 2020 15:37:25'))
this.time2$ = this.timerService.timer(new Date('August 9, 2041 15:37:25'))
}
Да, он работает, как я могу отправить в inputdate переменную из класса, я пытаюсь как это, но я получаю нуль в скрипте. –
Вам не нужно attr.Просто использовать [inputDate] должна быть строка, которая анализирует дату. Мой ответ ответил на ваш первоначальный вопрос, пожалуйста, можете ли вы пометить его как правильно? – KnowHoper
@HeySatan Это работает отлично для меня, используя статическую дату, но когда я пытаюсь использовать переменную, я получаю эту ошибку: 'Исправлены ошибки синтаксиса: не могу привязываться к 'inputDate', так как это не известное собственное свойство' , Любая идея, что его вызывает? Использование Angular2 RC.1 – kolli