// The logic that disposes of the overlay depends on the exit animation completing, however
// it isn't guaranteed if the parent view is destroyed while it's running. Add a fallback
// timeout which will clean everything up if the animation hasn't fired within the specified
// amount of time plus 100ms. We don't need to run this outside the NgZone, because for the
// vast majority of cases the timeout will have been cleared before it has the chance to fire.
this._closeFallbackTimeout = setTimeout(() => {
this._overlayRef.dispose();
}, event.totalTime + 100);
overlayRef.dispose()
производит отвязывание от событий клавиатуры.
Желательно конечно чтобы его можно было с минимальными усилиями потом перенести в веб.
function mayBeError() {
try {
throw new Error('iiii')
} catch (e) {
console.error('error in mayBeError');
throw e;
}
}
error
window.onerror = function (message, file, line, col, error) {
console.warn("Error occurred: " + error.message);
return false;
};
uncaughtException
max-height: 1000px; transition: max-height 1s;
const revStr = str => str.split("").reverse().join("");
+
Чтобы число получить и работало строгое равенство number === 0
new Audio()
создает HTMLAudioElement.muted
в true
. Вы же тут даже ссылки на него не оставляете, поэтому свойство ставить некуда.onMouseOver={() => settings.isSound && new Audio('/sound/menuhover.wav').play()}
return contacts[i][prop] || "No such contact"
if (contacts[i][prop]) {
return contacts[i][prop];
} else {
return "No such contact";
}
return contacts[i][prop]
? contacts[i][prop]
: "No such contact"
x === (false || x)
// имитация реквеста
function getDetailedHistory(itemId, allHomeEvent, done) {
setTimeout(300, () => done('im getDetailedHistory'));
}
// имитация реквеста
function getDetailedHistoryReverse(itemId, allHomeEvent, done) {
setTimeout(400, () => done('im getDetailedHistoryReverse'));
}
function getHistory(allHomeEvent, callback) {
// вместо запуска сначала соберем все запросы в массив функций.
const requests = [];
for (const event of allHomeEvent) {
let itemId = event.id
if (event.home.name === "Women") {
// записываем в массив функцию, замыкающую наш реквест
requests.push(done => getDetailedHistory(itemId, allHomeEvent, done));
}
if (event.away.name === "Women") {
requests.push(done => getDetailedHistoryReverse(itemId, allHomeEvent, done));
}
}
// запомнить число реквестов, чтобы понять когда все закончились, они же асинхронны.
let counter = requests.length;
// при окончании каждого реквеста, уменьшаем счетчик и смотрим уже конец или еще нет
const requestDone = () => {
counter -= 1;
if (counter <= 0) {
// реквесты кончились, пора дергнуть главный коллбэк
callback();
}
}
// а теперь пора выполнить весь массив
requests.forEach(request => request(requestDone));
}
getHistory(allHomeEvent, () => console.log('all done!'));
const requests = getHistory(allHomeEvent);
doneAll(requests, () => console.log('all done!'));
<select #optSelect (change)="kindSelect.kinds = filterConfig[optSelect.value]">
<option *ngFor="let opt of filterConfig | keyvalue">{{opt.key}}</option>
</select>
<select #kindSelect>
<option *ngFor="let kind of (kindSelect.kinds || filterConfig.fruit)">{{kind}}</option>
</select>
public filterConfig = {
fruit: ['apple', 'orange', 'pineapple', 'grape'],
vegetable: ['carrot', 'potato', 'dill', 'cucumber']
}
kindSelect.kinds
была введена из-за того, что если просто взять optSelect.value
на начальной отрисовке шаблона value еще нет, optSelect.value
появляется при первой детекции изменений, и в дев моде на втором проходе детекции обнаруживаются несоответствия значений с шаблоном, что вызовет ExpressionChangedAfterItHasBeenCheckedError.При этом на клиенте то команда получения сообщения от сервера всего 1 это socket.onmessage в итоге у меня ответ от сервера пихается в одну переменную и список подключений и сообщения, а как все это разделить?
socket.onmessage = message => {
const obj = JSON.parse(message);
switch (obj.type) {
case MessateTypes.Online: return onOnline(message.payload);
case MessateTypes.Messages: return onMessages(message.payload);
default: throw new Error('unrecognized message');
}
}
event.target.files
имеет тип FileList и у него конечно нет forEach, это не массив. Массив можно сделать через Array.from