2015-09-15 4 views
3

Я новичок в угловом, поэтому, возможно, я собираюсь сделать это совершенно неправильно. Я пытаюсь сделать treeView с angularJS директивами. Код, который я до сих пор выполняет, за исключением того, что, похоже, происходит утечка памяти, так как каждый раз, когда древовидное представление перезагружает его, оно замедляется и в конечном итоге приводит к сбою браузера.Управление памятью в AngularJS

Я создал следующие две директивы, чтобы выполнить мою задачу jscTreeView и jscTreeNode

Это fiddler имеет свой источник, он строит вам случайное дерево, и дает вам возможность выбрать количество узлов в дереве. Если вы удвоите это число до большего числа и перезагрузите несколько раз, вы заметите, что он постепенно замедляется до каждого раза.

Любые идеи о том, как очистить после себя, были бы очень благодарны, спасибо.

Edit:

Это fiddler является второй попыткой с этим я пошел в совершенно ином направлении. Это намного эффективнее, и код, по моему мнению, более чист. Однако у этого тоже есть проблема. периодически, и, казалось бы, случайным образом при обновлении дерева это бросает бесконечное исключение дайджест.

Примечание: не все функции, которые были в прежнем дереве, находятся в текущем дереве. Это потому, что я еще не запрограммировал его.

+2

Я не думаю, что область когда-либо разрушается ... Я поставил точку останова в элементе element.on ('remove'', но я не мог заставить его запускать. – Jorg

+0

Я заметил то же самое, но не мог понять, почему, какая-нибудь идея? – Jesse

+0

Я добавил 'template.on (« remove »...' at 'jscTreeNode', и все стало немного лучше, как при скорости, так и в памяти, но все же далеки от Совершенно. –

ответ

1

Как видно из комментариев в комментариях, я создавал, но никогда не выделял области в моем древовидном представлении. Хотя решение было не очень легко понять, это на самом деле довольно простое решение, и я многое прояснил для меня.

То, что мне нужно было сделать, это сделать клоун корневой области моего дерева var newScope = scope.$new();. Затем я построил все остальные поддеревья, а также их связанные узлы и скомпилировал с клонированной областью newScope. После компиляции он хранит клонированную область в переменную, приватную директиве lastScope = newScope;. Когда свойство watch обновляется и возвращается к моей директиве, уничтожается последняя клонированная область lastScope.$destroy();. Уничтожение этой клонированной области автоматически уничтожает любую дочернюю область, созданную под ним (узлы, а также поддеревья). Создается новый клон области, и процесс повторяется благодаря инструменту @ Jorg для подсчета областей, я вижу, что на каждой итерации все хорошо очищается. Вот решение fiddle.

Смежные вопросы