Angularjs: как вызвать $anchorScroll() после компиляции шаблона?

По сути это директива treeview помещенная в контейнер с ограниченной высотой, а потому имеем scroll. C помощью функции setCurrentNode перемещаемся на необходимый узел и скролимся к выделенному элементу. Проблема возникает при создании нового узла и перемещении в выбранную позицию. Я так понимаю что сперва должна построится DOM ($compile) модель а потом уже вызваться функция anchorScroll, но как?

.directive('treeModel', ['$compile', '$parse','$location', '$anchorScroll', function ($compile, $parse, $location, $anchorScroll) {
        return {
            restrict: 'A',
            link: function (scope, element, attrs) {
                var treeView = attrs.treeView;
                var treeModel = attrs.treeModel;
                if (!treeView || !treeModel)
                    return;
                
                var template;
                var scope_treeView = scope[treeView];
                if (scope_treeView && scope_treeView.childNodeTemplate)
                    template = scope_treeView.childNodeTemplate;
                else {
                    template =
                    '….';
                }
                if (attrs.angularTreeview) {
                    if (!scope_treeView) {
                        scope_treeView = {};
                        scope[treeView] = scope_treeView;

                        var currentNodeChanging = $parse(attrs.treeCurrentNodeChanging);
                        var currentNodeChanged = $parse(attrs.treeCurrentNodeChanged);
                        scope_treeView.clickNodeHead = function (node) {
                            //Свернуть или развернуть
                            if (!currentNodeChanging || currentNodeChanging(scope, { node: node })) {
                                node.collapsed = !node.collapsed;
                                scope_treeView.setCurrentNodeFromUser(node);
                            }
                        };

                        scope_treeView.clickNodeLabel = function (node) {
                            if (!currentNodeChanging || currentNodeChanging(scope, { node: node })) {
                                scope_treeView.setCurrentNodeFromUser(node);
                            }
                        };

                        scope_treeView.setCurrentNodeFromUser = function (node) {

                            if (scope_treeView.currentNode && scope_treeView.currentNode.selected) {
                                scope_treeView.currentNode.selected = undefined;
                            }
                            //set highlight to selected node
                            node.selected = 'selected';
                            //set currentNode
                            scope_treeView.currentNode = node;
                            if (currentNodeChanged)
                                currentNodeChanged(scope, { node: node });
                            while (node.parent) {
                                node = node.parent;
                                node.collapsed = false;
                            }
                        };

                        scope_treeView.setCurrentNode = function (node) {
                            scope_treeView.setCurrentNodeFromUser(node);

                            $location.hash(node.TaskId);
                            $anchorScroll();
                       };
                    }
                }
                else
                    if (!scope_treeView.childNodeTemplate)
                        scope_treeView.childNodeTemplate = template;

                //Rendering template.

                element.html('').append($compile(template)(scope));
            }
        };
    }]);
  • Вопрос задан
  • 2690 просмотров
Пригласить эксперта
Ответы на вопрос 1
Fesor
@Fesor
Full-stack developer (Symfony, Angular)
Ух какой стремный код... Я бы как минимум разделил все это на отдельные директивки и связал бы все через контроллер директивы treeView. Так же почитайте про изолированные скоупы и хоть чуть чуть облагородьте ваш код. Так же спешу вас обрадывать - template директивы можно определять как функцию и оперировать ею. Так же у вас всегда есть возможность делать что-то во время compile. а в link тогда уже этого и делать не нужно будет.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы