[
{ del: 'region_id', search: 'regionName' },
{ del: 'district_id', search: 'districtName' },
{ del: 'area_id', search: 'areaName' },
{ del: 'city_id', search: 'cityName' },
{ del: 'place_id', search: 'cityName' },
{ del: 'name', search: 'streetName' },
].forEach(n => {
if (this.tableParam[n.del]) {
delete this.tableParam[n.del];
this.searchForm.get(n.search).patchValue(null);
}
});
Исправил синтаксические ошибки.
if
или условие лишнее:} else (date.getDay() == 0) {
} else (a < 1) {
:
после ?
:this.updateTime.getMonth() > 9 ? : '0'
renderItems
стоит лишняя фигурная скобка, а после метода createPeriod
такой скобки не хватает.input.onchange
:this.input.onChange = this.onChange;
date
или data
? Вы бы определились:class dateInput {
class dateRange extends dataInput {
dateRange
отсутствует вызов конструктора базового класса - не хватает super();
перед this.container = ...
:constructor() { this.container = document.querySelector('.containerForLastUpdateRecordAndPeriodItems');
period = `${date.toLocaleDateString()} - {date.setHours(168).toLocaleDateString()}`;
period
должно быть periods[i]
.setHours
возвращает число, а не объект даты, так вызвать toLocaleDateString
не получится.$
перед фигурной скобкой при подстановке второй даты.b = false;
element = document.createElement('div')
renderItems
- не хватает this.
:onChange() { renderItems(this.createItems(this.createPeriod(this.inputValue)));
this
тут будет вовсе не экземпляром класса - надо привязывать контекст при установке этого метода в качестве обработчика события (this.onChange.bind(this)
- это в конструкторе dateInput
). А ещё, поскольку метод переопределён, надо не забыть вызвать метод базового класса, иначе не будет установлено значение свойства inputValue
:onChange(e) {
super.onChange(e);
this.renderItems(...
TypeError
при попытке выполнить хотя бы одну итерацию подобного цикла получите обязательно:for (const i = 0; i < n-a; i++) {
document.createElement
в качестве параметров? Откройте документацию и разберитесь, чтобы такую чушь больше не сочинять:const element = document.createElement('div', {textContent: item});
this
:this.container.appendChild(element);
forEach
, который представлен обычной функцией, то экземпляр класса оказывается недоступен. Или замените обычную функцию на стрелочную, или передайте this
в forEach
третьим параметром.createPeriod(date) { var newDate = date; newDate.year = newDate.year + 1;
createPeriod(dateStr) {
const start = new Date(dateStr);
const end = new Date(dateStr);
end.setFullYear(end.getFullYear() + 1);
return { start, end };
}
const range = Object.create(dateRange.prototype); range.constructor = range.constructor.bind(range); range.constructor();
new
конструктор вызывать нельзя.new dateRange;
.Подскажите, как еще можно оптимизировать(зарефакторить) данный js код?
const MS_IN_HOUR = 3600000;
const HOURS = 168;
for (let i = +period.start; i < +period.end; i += MS_IN_HOUR * HOURS) {
const date = new Date(i);
const hours = [ -120, 0, -24, -48, -48, -72, -96 ][date.getDay()];
periods.push([ hours, hours + HOURS ]
.map(n => (date.setHours(n), date.toLocaleDateString()))
.join(' - ')
);
[ periods[i + a], periods[i] ] = [ periods[i], periods[i + a] ];
updateTime
- как-то многовато, достаточно одного, чтобы запомнить значение под коротким именем:const ut = this.updateTime;
this.container.insertAdjacentHTML('beforeend',
`<div>Последнее изменение: ${ut.getDate()}.${`${ut.getMonth()}`.padStart(2, 0)}</div>` +
items.map(n => `<div>${n}</div>`).join('')
);