По сути это директива 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));
}
};
}]);