我在angularjs中遇到过只有超时才能解决问题的几种情况。我真的很想了解为什么会发生这种情况,以及如何解决这个问题。
示例:
opLibrary.directive('opClick', function($parse, $location, $timeout, opDebug) {
return function(scope, element, attrs) {
var action = attrs.opClick.substring(0, 1) == '/' ? attrs.opClick : $parse(attrs.opClick);
var event = opDebug.desktop ? 'mousedown' : 'touchstart';
element.bind(event, function(e) {
e.preventDefault();
$timeout(function() {
if (angular.isFunction(action)) action(scope);
else $location.path(action);
}, 0);
});
}
});
没有超时$location.path只是不会触发
$.getScript('//connect.facebook.net/en_UK/all.js', function(){
FB.init({
appId: 'xxx',
});
$timeout(function() {
$scope.fbInitComplete = true;
}, 0);
});
没有超时的视图不会基于fbInitComplete更改进行更新,尽管它在视图更改之前进行了更新,就好像变量的值确实发生了更改一样,但作用域并没有捕捉到它
使用$scope.apply
而不是超时:
scope.$apply(function() {
if (angular.isFunction(action)) action(scope);
else $location.path(action);
});
原因:异步执行某些操作时,例如执行ajax调用时($http
为您执行$scope.$apply
),您必须通知angular。