Желательно конечно чтобы его можно было с минимальными усилиями потом перенести в веб.
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("");
private expandAcsendants(index: number) {
for (let c = index; this.treeControl.dataNodes[c]; c--) {
this.treeControl.expand(this.treeControl.dataNodes[c]);
if (this.treeControl.dataNodes[c].level === 0) {
break;
}
}
}
встроенные инструмены ангуляра для работы с веб сокетами
Почему тогда сейчас я могу работать с данным апи из любого другого места средствами ангуляра?
+
Чтобы число получить и работало строгое равенство number === 0
${userdir}/etc/netbeans.conf
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.