AngularJS指令范围绑定未在链接函数中立即填充

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AngularJS指令范围绑定未在链接函数中立即填充相关的知识,希望对你有一定的参考价值。

我正在编写以下指令:

.directive('mypagination', function () {
    return {
        restrict: 'E',
        scope: {
            pageCount: "=",
        },
        template: "{{pageCount}}",
        link: function ($scope, $element, $attrs) {
            $scope.pages = [];
            for (var i = 1; i <= $scope.pageCount; i++) {
                $scope.pages.push(i);
            }
        }
    }
})

我的问题是$scope.pageCount循环中的for设置为0,但模板中的{{pageCount}}正在呈现正确的值。

html中,指令被调用如下:

<mypagination page-count="mjaController.pages.length" 
              on-page-change="mjaController.fetchStuff(page)">
</mypagination>

为什么在pageCount函数中link的值为0,但在页面上正确呈现?

答案

当你的link函数执行时,pageCount可以是0,因为它绑定到mjaController.pages.length属性,我猜是从API检索并且是async调用。一旦mjaController.pages充满了一些数据,那么pageCount被设置为它的长度并通过template循环显示在$digest上,但link函数将不再执行。为了使其按预期工作,请执行以下操作

.directive('mypagination', function () {
    return {
        restrict: 'E',
        scope: {
            pageCount: "=",
        },
        template: "{{ pages()|json }}",
        link: function ($scope, $element, $attrs) {
            $scope.pages = function () {
              var pages = [];
              for (var i = 1; i <= $scope.pageCount; i++) {
                pages.push(i);
              }
              return pages;
            }
        }
    }
})

method中添加$scope并在模板中使用其返回值。

另一答案

使用$watch等待数据从服务器到达:

.directive('mypagination', function () {
    return {
        restrict: 'E',
        scope: {
            pageCount: "<",
            onPageChange: "&"
        },
        template: "{{pageCount}}",
        link: function (scope, elem, attrs) {
            scope.$watch("pageCount", function(newValue) {
                if(newValue)
                    scope.pages = [];
                    for (var i = 1; i <= newValue; i++) {
                        scope.pages.push(i);
                    }
                }
            });
        }
    }
})

通常,这种类型的数据操作应该在指令的控制器中完成,以利用life-cycle hooks,例如$onChanges。有关更多信息,请参阅AngularJS Developer Guide - Component-based Application Architecture

以上是关于AngularJS指令范围绑定未在链接函数中立即填充的主要内容,如果未能解决你的问题,请参考以下文章

AngularJS指令包含范围=假?

在 AngularJS 中从没有隔离范围的指令调用控制器函数

具有绑定函数参数的AngularJS指令

AngularJS 自定义指令两种方式绑定

Angular JS:当我们已经有了具有作用域的指令控制器时,还需要指令的链接函数吗?

AngularJS TypeScript 指令链接函数