为什么在指令中对外部作用域的更改需要作用域。$ apply()即使我将scope选项设置为false?

时间:2013-11-13 16:40:47

标签: javascript angularjs angularjs-directive angularjs-scope

最近我注意到改为某些角度 - 提供者对象,或者我自己的 - 外部范围(指令的外侧,控制器中)需要将代码包装在scope.apply()中。

任何人都可以详细说明这种相当奇怪的行为行为吗?。

应用是角度识别在其自身范围之外发生的事物(不同的库等)的一种方式,角度指令绝对不属于该定义。

示例代码:

app.directive('socialAuth', function(utils, authService, $location){
    return{
            restrict: 'A',
            scope: false,
            link: function(scope, elem, attrs){
                elem.bind('click', function(){
                            utils.cleanSocialSearch();
                            if(attrs.checkbox){
                              scope.$apply(function(){
                                scope.model.personalShare[attrs.network] = true;  
                                $location.search('presonalShare', '1');//those 2 do nothing outside of the $apply function
                              });
                            }
                            var callback = encodeURIComponent(window.location.href);
                            var loginUrl = utils.getBaseUrl() + '/social/login/' + attrs.network + '?success_url=' + callback;

                              location.href = loginUrl;  


                        });
            }
    }

});

2 个答案:

答案 0 :(得分:2)

当您需要告诉$apply在其上下文之外发生的事情时,需要

Angular。这样Angular可以刷新绑定。

简而言之,使用elem.bind绑定的是经典事件,而不是有角度的东西。因此elem.bind('click'...)绑定click event这是一个经典事件(如focusblur等)。经典事件在角度上下文之外处理,因此您需要$ apply以使角度知道。

如果您需要更多详细信息,可以阅读here:)

答案 1 :(得分:1)

在您的示例中,这是因为代码是由浏览器处理的单击事件处理程序。

因此决定是否需要apply()的是执行代码运行的上下文。在这种情况下,即使Angular设置回调(处理程序),如您所知,它是执行它的浏览器,因为它是由浏览器事件触发的异步事件处理程序。因此需要通知Angular。