事件绑定AngularJS方式?

时间:2012-11-02 13:29:15

标签: standards angularjs

好的,所以我知道在使用AngularJS时在控制器中进行任何DOM操作被认为是不好的做法,你应该使用指令和$ scope来处理那些东西,但是事件绑定呢?从它的外观来看,考虑到所有内置的事件指令,如ngClick,ngMousedown,ngMouseenter等,这也令人不悦......但如果是这种情况,那么我有一段代码,我不知道如何做AngularJS的方式。

我正在构建的应用程序具有无限滚动功能,并且使用这段代码(当前位于控制器中)实现:

$(document).bind('scroll', function(){
    if(!$scope.loadingIssues && $(window).scrollTop() + $(window).height() >= $('.user-feedback-list').offset().top + $('.user-feedback-list').height()) {
        $scope.loadIssues();
    }
});

这允许用户滚动页面,当页面到达存储具有无限滚动的数据的元素的底部时,它会触发加载更多数据的函数。现在我没有进行任何DOM操作,所有函数只更新附加到$ scope的数据,我让AngularJS进行DOM更新,但是这个事件是否与AngularJS的最佳实践绑定?如果是这样,我怎么能用AngularJS方式做到这一点(我不认为指令在这种情况下会起作用,因为我认为不可能将指令附加到文档对象)?

1 个答案:

答案 0 :(得分:1)

我不认为目前有一种AngularJS方式可以进行这种事件绑定。正如我所知,为所有缺失的事件添加本机支持是正在进行的事情,但它尚未在任何稳定版本中发布。

所以现在我们必须像你在问题中所述那样做。

我认为,你需要这样做才能让它发挥作用:

$scope.$apply(
    function() {
        $scope.loadIssues();
    }
);

这是因为您正在从AngularJS之外处理事件。 $ apply事件确保AngluarJS会收到任何模型更改以及loadIssues()调用可能导致的类似事件的通知。