【发布时间】:2016-02-25 13:16:20
【问题描述】:
我创建了以下指令:
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 定义的,而不是它当前所在的任何选项卡。怎么改?
【问题讨论】:
-
在body TAG中去掉ng-cloak之后的"
-
首先修复一些问题。在您的 HTML 中使用“自动加载”而不是“自动加载”,以正确的方式限制您的指令
-
@CodeNashor 因为浏览器的工作方式,属性名称的大小写信息丢失了,所以实际上你可以使用
auto-Load
标签: javascript angularjs