AngularJS指令范围函数未被调用

时间:2016-02-25 13:16:20

标签: javascript angularjs

我创建了以下指令:

app.directive("autoLoad", function ($window) {
    return { 
        scope: {
            do: '&'
        },
        link : function(scope, element, attrs) {
            var scroller = element[0];
            angular.element($window).bind("scroll", function() {
                if(($(window).scrollTop() + $(window).height()) > ($(document).height() - 100)) {
                    console.log("GOT HERE!");
                    scope.do(); // LOAD POSTS
                }
            });
        }
    };
});

当用户滚动到页面底部时,该指令应调用do函数。这是使用指令的div:

<body ng-app="storeApp" layout="row" ng-controller="MainCtrl" ng-cloak">
...
<div flex layout="column" tabIndex="-1" role="main"
    class="md-whiteframe-z2" auto-Load do="doSomething()">

控制器如下所示:

app.controller("HomeCtrl", function($scope, controllerManager) {
    ...

    $scope.doSomething = function() {
        console.log("PLEASE WORK!");
    };
});

当我到达页面底部时,GOT HERE正在打印,但第二个声明从未显示。为什么控制器中的功能没有被调用?

编辑:我正在使用标签,每个标签都有不同的控制器。所以应用于body对象的主控制器实际上没有doSomething函数:

app.config(function($stateProvider, $urlRouterProvider) {
    $stateProvider.state('home', {
        url : "/home",
        templateUrl : "main.html",
        controller : 'HomeCtrl'
    }).state('top', {
        url : "/top",
        templateUrl : "main.html",
        controller : 'TopCtrl'
    }).state('trending', {
        url : "/trending",
        templateUrl : "main.html",
        controller : 'TrendingCtrl'
    })
    $urlRouterProvider.otherwise('/home');
});

app.controller("MainCtrl", function($scope, $location, $log) {
    $scope.selectedIndex = 0;
    $scope.$watch('selectedIndex', function(current, old) {
        switch (current) {
        case 0:
            $location.url("/home");
            break;
        case 1:
            $location.url("/top");
            break;
       case 2:
            $location.url("/trending");
            break;
        }
    });
});

do something函数实际上是每个子控制器的一部分:HomeCtrl,TopCtrl等。

问题似乎是范围是由MainCtrl定义的,而不是它当前所处的任何标签。怎么能改变呢?

1 个答案:

答案 0 :(得分:1)

首先,您确实需要使用服务或工厂,但如果您仍想使用表达式绑定,请将您的代码从链接函数移动到指令控制器(请参阅jsbin https://jsbin.com/nohotizefi/edit?html,js,output

NSData

});