0

最近我注意到更改为一些 Angular 提供程序对象或我自己的外部范围(在指令之外,在控制器中)需要将代码包装在 scope.apply() 中。

谁能详细说明这种相当奇怪的行为行为?

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

示例代码:

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;  


                        });
            }
    }

});
4

2 回答 2

2

$apply当您需要告诉Angular某些事情发生在其上下文之外时,就需要它。这样Angular可以刷新绑定。

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

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

于 2013-11-13T17:12:45.670 回答
1

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

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

于 2013-11-13T17:13:57.757 回答