Diretiva AngularJS para rolar para um determinado item
Eu tenho uma variável de escopo $ scope.first_unread_id que é definida no meu controlador. No meu modelo, tenho:
<div id="items" >
<ul class="standard-list">
<li ng-repeat="item in items" scroll-to-id="first_unread_id">
<span class="content">{{ item.content }}</span>
</li>
</ul>
</div>
e minha diretiva parece:
angular.module('ScrollToId', []).
directive('scrollToId', function () {
return function (scope, element, attributes) {
var id = scope.$parent[attributes["scrollToId"]];
if (id === scope.item.id) {
setTimeout(function () {
window.scrollTo(0, element[0].offsetTop - 100)
}, 20);
}
}
});
funciona, no entanto, duas questões:
Existe uma maneira melhor de obter o "first_unread_id" fora do escopo do controlador no escopo de interrogação direta do que $ parent? Isso parece um pouco "nojento". Eu estava esperando que eu pudesse passar isso através da visão para o direto como um parâmetro sem ter que repetir isso no elemento ever li.
Existe uma maneira melhor de evitar a necessidade da chamada setTimeout ()? Sem isso, funcionaas vezes - Eu imagino devido à diferença no tempo de layout. Entendo que a sintaxe que usei está definindo uma função de link - mas não está claro para mim se isso é um pré ou pós-link por padrão - e se isso é importante para o meu problema.