Цитата:
|
Ответ от создателя ангуляра
|
Да там хрен уйдеш от грязной проверки.
Авторам ангуляра можно было поиграться с сеттерами defineProperty. Но Watcher непосредственно из сеттера defineProperty дергать не вариант. Так как в случае присваивания свойств в цикле, сеттеры дернут watcher столько раз сколько будет итераций в цикле. К слову set() в extJs аналогично будет генерить события для каждого вызова set. Сейчас благодаря отсутствию сеттеров можно вытворять со скопом все что угодно, а потом опубликовать изменения одним махом при помощи digest.
Второй вариант использования сеттеров defineProperty заключается в регистрирации сеттерами в каком нибудь массиве изменившихся свойств. Затем в момент вызова digest можно бы было публиковать только рекомендованные сеттерами свойства. Однако похоже что быстрее просто сравнить новое значение свойства со старым значением, чем тратить время на работу геттеров/сеттеров. Только представьте сколько времени сожрут геттеры/сеттеры вызываемые при использовании скопа внутри цикла.
На мой взгляд сравнение нового значения со старым это самый оптимальный подход.
а вот watchСollection это медленная штука.
Изменение большого массива который еще и наблюдается целиком это пиздец, ангуляр каждый элемент в массиве при публикации проверит чтобы найти измения.
из исходников
// copy the items to oldValue and look for changes.
for (var i = 0; i < newLength; i++) {
if (oldValue[i] !== newValue[i]) {
changeDetected++;
oldValue[i] = newValue[i];
}
}
1й) не прятный момент это перебор массива но без него ни как. Если мы наблюдаем весь массив целиком то нам важно любое изменение.
2й) неприятный момент это то что watchcollection всегда имеет копию наблюдаемого массива oldValue со старыми значениями, что было с чем сравнивать. Тобиш расходуется память в двойном размере.
Ище одна жопа в том что цикл нельзя прервать при первом обнаруженном изменении так как нужно скопировать все значения в oldvalue. Получается в любом случае массив придется перебрать целиком.
к слову обьекты наблюдаемые целиком он тоже перебирает.
За исключение watchcollection все реализовано потрясно, что касается watchcollection то не уверен что можно придумать что то лучше.