我创建了以下指令:
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定义的,而不是它当前所处的任何标签。怎么能改变呢?
答案 0 :(得分:1)
首先,您确实需要使用服务或工厂,但如果您仍想使用表达式绑定,请将您的代码从链接函数移动到指令控制器(请参阅jsbin https://jsbin.com/nohotizefi/edit?html,js,output)
NSData
});