【问题标题】:scope.$apply is undefined , not working in scrolly directivescope.$apply 未定义,不能在滚动指令中工作
【发布时间】:2016-08-19 20:46:51
【问题描述】:

我正在尝试为我的 div 使用滚动指令。当用户向下滚动并结束 div 时,我想调用一个函数。它给了我未定义的 Scope.$apply 函数? 请任何人帮助。提前谢谢 这是我的html代码

 <div id="container"  style="
  position:absolute;
  top: 60px;
   width: 100%;
  left:0px;height:91%;overflow-y:scroll;" scrolly="showMore()" >

这里是应用程序和控制器

 var app = angular.module('smac',[]);
 app.controller('asd',function ($http,$scope) {
   $scope.showMore = function(){

     alert('div finished');
  }
  });

指令是

   app.directive('scrolly', function () {
return {
    restrict: 'A',
    link: function (scope, element, attrs) {
        var raw = element[0];
        console.log('loading directive');

        element.bind('scroll', function () {
            console.log('in scroll');

            console.log(raw.scrollTop + raw.offsetHeight >= raw.scrollHeight)
            if (raw.scrollTop + raw.offsetHeight >= raw.scrollHeight) {
               scope.$apply(attrs.scrolly)

                console.log(scope.$apply(attrs.scrolly)); // this is undefined
            }
            });
    }
};
 });

【问题讨论】:

  • 该控制台日志正在打印 scope.$apply 的返回值,我敢打赌这是未定义的。如果您想检查 is scope.$apply 本身是未定义的,您需要使用。 console.log(scope.$apply);
  • 为什么它返回 undefined ? @ZacBraddy
  • 你真正的问题是什么?你想达到什么目标,什么不工作?
  • 在滚动 div 完成时,它应该调用一个函数来渲染更多的 div,但应用函数永远不会被调用 @kabaehr

标签: javascript angularjs scroll


【解决方案1】:

如果我没记错的话,你的 scope.$apply 函数调用返回 undefined 的原因是你的 showMore 函数没有返回值。如果您以角度查看 $apply 函数的源代码,您会看到许多实现,但它们都或多或少只是调用 $eval 函数:

来自 Angular 的来源

function $apply(expr) {
    try {
        return $eval(expr);
     } catch (e) {
         $exceptionHandler(e);
     } finally {
          $root.$digest();
      }
 }

Here is a link to another SO question about what $eval does

所以我会假设 Angular 试图将滚动属性的值评估为执行你的函数的角度表达式,因为你的函数没有返回任何你未定义的东西。

这当然可以解释为什么你会从 scope.$apply 得到 undefined 作为返回值,但不能回答你为什么需要知道返回值的问题?

【讨论】:

  • 看看这个小提琴 @Zac 我从这里使用了 scroly 代码 [jsfiddle.net/ADukg/4831/]
  • 链接已损坏@Asad
  • 这里是问题链接,请查看答案@Zac [stackoverflow.com/questions/21989923/…
  • 好的,那么你想在你的代码中使用的那个小提琴发生了什么。我不清楚你认为哪里出了问题。
  • 是的,我使用了该小提琴中的滚动指令。我是新的角度所以当 div 完成滚动时我想调用 scope.$apply(attrs.scrolly) 的 showmore 函数。返回未定义
【解决方案2】:

应该是$scope.$apply

你错过了作用域之前的 $

【讨论】:

  • 这不是问题@Vinod
  • 参数也是一个作用域。
  • 他的函数的参数被称为scope 而不是$scope 与控制器的约定一样。我认为使用scope 作为链接函数的参数是因为角度文档中给出的许多链接函数示例都是这样做的。
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 2015-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多