最近我注意到改为某些角度 - 提供者对象,或者我自己的 - 外部范围(指令的外侧,控制器中)需要将代码包装在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;
});
}
}
});
答案 0 :(得分:2)
$apply
在其上下文之外发生的事情时,需要 Angular
。这样Angular
可以刷新绑定。
简而言之,使用elem.bind
绑定的是经典事件,而不是有角度的东西。因此elem.bind('click'...)
绑定click event
这是一个经典事件(如focus
,blur
等)。经典事件在角度上下文之外处理,因此您需要$ apply以使角度知道。
如果您需要更多详细信息,可以阅读here:)
答案 1 :(得分:1)
在您的示例中,这是因为代码是由浏览器处理的单击事件处理程序。
因此决定是否需要apply()
的是执行代码运行的上下文。在这种情况下,即使Angular设置回调(处理程序),如您所知,它是执行它的浏览器,因为它是由浏览器事件触发的异步事件处理程序。因此需要通知Angular。