Ускорение функции Angular $compile

83
14

Я вручную компилирую шаблон для новой области:


var scope = _.assign($rootScope.$new(true), {
foo: 1,
bar: 2
})
var element = angular.element('<my-element foo="foo" bar="bar"></my-element>')
$compile(element)(scope)
element.appendTo(container)

После запуска базового профиля самая медленная часть этого кода $compile, которая занимает ~ 1 мс на компиляцию. Мне нужно собрать ~ 100 элементов за раз, когда пользователь прокручивает.


Есть много оптимизаций, которые я могу применить для ускорения компиляции после первого раунда компиляции $, но я бы хотел ускорить 1-й раунд из 100 компиляций. Я также хотел бы сохранить шаблоны в Angularland и не вводить необработанный HTML.


Как?


Изменить: Скопировать + вставить мой комментарий ниже для просмотра для любого, кто видит этот поток в будущем:


Хорошо, это, в конечном счете, имеет смысл. Если вы передадите функцию в качестве второго аргумента в $link, angular будет клонировать node для вас. Если вы этого не сделаете, он будет повторно использовать один и тот же node при каждом вызове $link. В любом случае вы можете получить доступ к возвращенному node синхронно (как возвращаемое значение $link) и асинхронно (в вашем обратном вызове). Это плохо разработанный API, я задал проблему в angular вопросительном трекере здесь - github.com/angular/angular.js/issues/11824

спросил(а) 2015-04-30T06:54:00+03:00 4 года, 11 месяцев назад
1
Решение
100

Если элементы имеют одинаковую структуру и только отличаются по объему, с которым они связаны, тогда вы должны $compile шаблон один раз, а затем link каждый из 100 элементов против своих соответствующих областей.

var myElement = angular.element('<my-element foo="foo" bar="bar"></my-element>');
var myElementLinkFn = $compile(myElement);

// "items" here is the data that drives the creation of myElement elements
angular.forEach(items, function(item){
var newScope = $scope.$new(true);

newScope.foo = item.foo;
newScope.bar = item.bar;

myElementLinkFn(newScope, function(clone){
container.append(clone);
})
});

ответил(а) 2015-04-30T07:45:00+03:00 4 года, 11 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема