export class AlbumItemComponent implements OnInit {
//@Input() public album: any;
@Input() public album: Album[];
<div *ngFor="let album of albums">
<app-album-item [album]="album"></app-album-item>
</div>
list.addEventListener('keydown', function(parentLi) {
параметром придет KeyboardEvent, в котором есть данные о нажатых клавишах.По идее в цикле перебираются li с классом parent, и у того, который должен быть подсвечен добавляется к классу пометка activeХранить состояние во view слое очень плохая идея. Запоминайте индекс выделенного элемента в переменной и по событию проверяйте возможность переключения подсветки и меняйте классы.
for(var i = 0; i < parentLi.length; i++) {
light(parentLi[i].firstChild)
}
function light(parentLi) {
parentLi.addEventListener('mouseover', function() {
this.style.color = 'pink';
this.style.backgroundColor = 'grey';
})
parentLi.addEventListener('mouseout', function() {
this.style.color = 'black';
this.style.backgroundColor = 'white';
})
}
вот тут в цикле создается целая пачка однотипных функций, каждая из которых будет жрать память пользователя. Притом эта задача вообще легко решается на чистом CSS через hover. const DEFAULT_KEY = 'defaultKey';
type DEFAULT_KEY = typeof DEFAULT_KEY;
type BaseObject = Record<PropertyKey, Record<PropertyKey, unknown>>;
type PropertyOfObject<T extends BaseObject> = {
<K extends keyof T>(key: K): DEFAULT_KEY extends keyof T[K] ? T[K][DEFAULT_KEY] : null;
<K0 extends keyof T, K1 extends keyof T[K0]>(key0: K0, key1: K1): T[K0][K1];
};
function getPropertyOfObject<T extends BaseObject>(obj: T): PropertyOfObject<T> {
type K0 = keyof T;
type K1 = DEFAULT_KEY | keyof T[K0];
return ((keyOne: K0, keyTwo: K1 = DEFAULT_KEY) =>
obj[keyOne]?.[keyTwo] ?? null
) as PropertyOfObject<T>;
}
function getProductCollection(func:
| ((error: Error, data: null, info: string) => any)
| ((error: null, data: ProductUnit[], info: string) => any)
): void {}
((error: Error, data: null, info: string) => any) | ((error: null, data: ProductUnit[], info: string) => any)
Это совершенно не тоже самое, что(error: null | Error, data: ProductUnit[] | null, info: string) => any
Ну и кстати, перегрузка в таком случае не особо нужна, и даже вредна.function getProductCollection(func: {
(error: Error, data: null, info: string): any;
(error: null, data: ProductUnit[], info: string): any;
}): void {}
Это защитит внутренности getProductCollection от его неправильного вызова, но снаружи, Вы получите в колбэк обобщенный тип:(error: null | Error, data: ProductUnit[] | null, info: string) => any
Это заставит вызывающий код делать или лишние проверки, или кастовать типы, так что если не нужны сильные гарантии в пределах одной функции, то можно обойтись простым вариантом:function getProductCollection(func: (error: null | Error, data: ProductUnit[] | null, info: string) => any): void { }
Я подумываю сделать проверку символов до и после запятой, но не знаю, как это сделать. Помоги мне, пожалуйста.Проверяйте на число символы
in[indexIN - 1]
и in[indexIN + 1]
, при этом стоит учесть выход за границу при indexIN == 0
.#define IS_DIGIT(I) (in[(I)] >= '0' && in[(I)] <= '9')
if (IS_DIGIT(indexIN) || (in[indexIN] == ',' && indexIN != 0 && IS_DIGIT(indexIN - 1) && IS_DIGIT(indexIN + 1)))
indexIN++;
Есть ли аргументы против этого?хотя бы то что куки - это долговременное хранилище, а никак не средство общения клиента с сервером
Бэкенд-программист очень любит extract($_POST);
на сколько помню php, get параметры передаются в $_GET
и никак не аффектят $_POST
if (hours === 10 || (hours === 11 && minutes < 30)) {
// 1
} else if ((hours === 11 && minutes >= 30) || hours === 12) {
// 2
}
function createDate(hours, minutes) {
const d = new Date();
d.setHours(hours);
d.setMinutes(minutes);
return d;
}
const time1 = createDate(10, 0).getTime();
const time2 = createDate(11, 30).getTime();
const time3 = createDate(13, 0).getTime();
const now = Date.now();
if (now >= time1 && now < time2) {
// 1
} else if (now >= time2 && now < time3) {
// 2
}