Я пытаюсь сохранить все меню в javascript, чтобы он быстро загружался для пользователей (я знаю, что он идет в памяти, но это не так плохо, и это не должно расти в ближайшее время).Ng-repeat vs create dom in jquery
Моя проблема в том, что если я сгенерирую его в простом javascript, он создается почти мгновенно, а если я использую ng-repeat, он намного медленнее.
Его немного грязный, и я упростил потому что я также добавлять классы и другие атрибуты, но вы должны получить суть его от этого ..
Я знаю, что может еще больше упростить следующий повторяющийся HTML с помощью используя директивы, но производительность будет такой же, так что несите меня.
Использование нг-повтора (4 вложенной для петель):
<div ng-repeat="item in catList">
<a> <span> {{item.name}}</span> </a>
<div ng-if="item.children.length > 0">
<div>
<div ng-repeat="item2 in item.children">
<a> <span> {{item2.name}}</span> </a>
<div ng-if="item2.children.length > 0">
<div>
<div ng-repeat="item3 in item2.children">
<a> <span> {{item3.name}}</span> </a>
<div ng-if="item3.children.length > 0">
<div>
<div ng-repeat="item4 in item3.children">
<a> <span> {{item4.name}}</span></a>
<div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
(проверьте консоль на время, необходимое для обработки и визуализации списка - я не был уверен, когда начала отсчета времени его в угловом. Я знаю, что 'app.run (функцию() {})' работает после загрузки все, но я не уверен, когда все начинается)
http://jsfiddle.net/0m0qod3u/1/
И теперь для создания его генерации Dóm элементов динамически в JS/JQuery:
function printCategoriesMenu(list, fatherElem, idObj, currPath, level){
for (var i = 0; i < list.length; i++){
var currElem = list[i];
var thisElemsPath = currPath;
if (level == 0){
thisElemsPath += currElem.name;
} else {
thisElemsPath += "/" + currElem.name;
}
var el_a = document.createElement('a');
var el_span = document.createElement("span");
el_span.textContent = currElem.name;
el_a.appendChild(el_span);
var el_div = document.createElement("div");
el_div.setAttribute("id", idObj.eid + "_children");
fatherElem.appendChild(el_a);
fatherElem.appendChild(el_div);
idObj.eid++;
if (currElem.children.length > 0){
printCategoriesMenu(currElem.children, el_div, idObj, thisElemsPath, level+1);
}
}
}
jQuery(document).ready(function(){
var start = window.performance.now();
console.log("START TIME: " + start);
printCategoriesMenu(catList, document.getElementById('categoriesList'), {'eid': 0}, "", 0);
var end = window.performance.now();
console.log("END TIME: " + end);
console.log("time: " + (end - start));
})
После добавить различные атрибуты (класс, нг-нажмите/OnClick ..) , производительность его с использованием повторения ng еще хуже и имеет плохую задержку при первой загрузке страницы.
Что я пытался сделать, чтобы улучшить ее производительность с использованием углового до сих пор:
Используя ng-repeat, было бы много двухсторонних привязок, поэтому я попытался использовать «bindonce», и это, похоже, не повлияло на производительность, если вообще.
Пробовал использовать 'track by', без разницы в производительности.
Пробовал использовать limitTo для генерации подкатегорий в разное время (сначала я бы сгенерировал первый уровень и второй, когда пользователь выберет первую категорию, загрузятся третьи подкатегории и т. Д.). Это работало намного лучше, но при создании уровней подкатегории была бы задержка при выборе пользователем одной категории (повторение ng синхронно, и это выглядело не очень хорошо) выглядели так, что страница застыла на 1-2 секунды :()
Неудобно хранить часть генерации меню в файле js/jquery, в то время как все остальное является угловым приложением, поэтому я попытался генерировать dom динамически (так что НЕ использую ng-repeat) в своем контроллере с помощью директивного мышления, которое я бы чтобы получить ту же производительность, что и js/jquery. К сожалению, это было так же медленно, как использование ng-repeat (извините, у меня нет jsfiddle для этой части).Эта часть была действительно dissappointing :(
Я видел несколько постов по оптимизации производительности нг-повтора и наблюдение за сколько наблюдатели получают создается для каждого элемента/и т.д .. Я хотел бы сделать это, как скоро, как я сделал в прошлом точку с этим проектом.
Любые предложения?
Спасибо, Mihai
Библиотека Bindonce делает это; Я пробовал это, как я уже упоминал выше; производительность растет, но не значительно. https://github.com/Pasvaz/bindonce – PenguinSource
@PenguinSource угловое привязку на время намного лучше, чем bindonce, но не каждое приложение может быть легко перенесено на 1.3.x, если вам нужно поддерживать старые браузеры. Но вы могли бы подумать о том, чтобы попробовать answer.js – PSL
Хм, хорошо, я обязательно буду в этом разбираться. Я использую v1.3.5. Но то, что действительно забивает меня, - это то, что генерация dom динамически в js/jquery намного быстрее, чем генерация dom динамически в угловом. Я подумал, что, возможно, это потому, что для загрузки угловой библиотеки требуется больше времени, но я не думаю, что это «узкое место». – PenguinSource