tengo una variable $ scope.first_unread_id alcance que se define en mi controlador. En mi plantilla, que tengo:AngularJS directiva para desplazarse a un elemento dado
<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>
y mi directiva se parece a:
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, sin embargo, dos preguntas:
¿Hay una mejor manera de conseguir la "first_unread_id" fuera del alcance del controlador en el ámbito directo que interroga. $ parent? Esto parece un poco 'asqueroso'. Esperaba poder pasar eso a través de la vista al directo como un parámetro sin tener que repetir eso en cualquier elemento li.
¿Hay una mejor manera de evitar la necesidad de la llamada setTimeout()? Sin él, funciona veces - Imagino que debido a la diferencia en el tiempo de diseño. Entiendo que la sintaxis que he utilizado es definir una función de enlace, pero no me queda claro si se trata de un enlace previo o posterior por defecto, y si eso es importante para mi problema.
https://docs.angularjs.org/api/ng/service/$anchorScroll – Blazemonger
Ha comprobado fuera AnchorScroll de Angular? [Servicio AnchorScroll] (https://docs.angularjs.org/api/ng/service/$anchorScroll) –