8

我正在制作一个分页应用程序,用户可以在同一窗口中切换低谷页面(页面显示在彼此下方)。每当有人更改页面时,我希望窗口滚动正确的页面

这是我的页面指令:

.directive('page', function () {
    return {
        restrict: "E",
        transclude: true,
        template: '<div ng-transclude></div>',
        link: function(scope, element, attrs) {
            /*
            * Better in controller, now the function has to be evaluated for every directive.
            * */
            scope.$on('pageChanged', function(event, page) {
                if (parseInt(attrs.number) === page) {
                    if (page === 1) {
                        window.scrollTo(100, element[0].offsetTop - 110);
                    }
                    else {
                        window.scrollTo(0, element[0].offsetTop - 60);
                    }
                }
            });
        }
    }

这可行,但现在每个指令都侦听 pageChanged 事件并采取相应措施。我宁愿只听控制器,让控制器将窗口滚动到正确的页面。(这样只需要评估一个函数)。

$scope.$on('pageChanged', function (event, pageNr) {
            $scope.currentPage = pageNr;
            /*
            * Scroll to the right page directive here
            **/
        });

但是要做到这一点,我需要访问控制器中的页面元素,有没有办法做到这一点?

我还在寻找一种可以在用户滚动窗口时将 currentPage 更改为正确页面的方法。

4

1 回答 1

23

我认为你不应该依赖事件,而是controller向指令对象添加一个属性并在那里声明指令的控制器。类似的东西(没有测试过):

.directive('page', function () {
    return {
        restrict: "E",
        transclude: true,
        template: '<div ng-transclude></div>',
        controller: function ($scope, $element, $attrs, $transclude, otherInjectables) {
            // Add ng-click="goToPage(n)" directives on your HTML. Those should be inside of the <page> element for this to work.
            $scope.goToPage = function (page) {
                if (page === 1) {
                    window.scrollTo(100, $element[0].offsetTop - 110);
                }
                else {
                    window.scrollTo(0, $element[0].offsetTop - 60);
                }
        },
    }
});

有关更多信息,请参阅有关指令的 AngularJS 文档

于 2013-08-20T22:38:09.203 回答