2014-10-15 2 views
3

Почему представление не обновляется до «Кто-то»?Почему AngularJs не обновляется после асинхронного вызова Ajax?

var app = angular.module('Async', []); 
 

 
app 
 
    .controller('MainController', function($scope) { 
 
    $scope.user = { 
 
     name: "No one" 
 
    }; 
 

 
    jQuery.ajax("/" 
 
     , { 
 
     async: true, 
 
     type: "POST", 
 
     } 
 
    ).always(function() { 
 
     $scope.user.name = "Someone"; 
 
     alert($scope.user.name); 
 
    }); 
 
    }); 
 

 
angular.bootstrap(document, ['Async']);
<div data-ng-controller="MainController"> 
 
    <div data-ng-view="">User's name: {{ user.name }}</div> 
 
</div> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-route.js"></script>

+0

возможно дубликат [Angular области контроллера не обновляется после вызова JQuery Ajax] (http://stackoverflow.com/questions/21127709/angular-controller-scope-not-updating-after -jquery-Ajax-вызов) –

ответ

5

Когда вы делаете асинхронные вызовы, как этот снаружи углового мира, вы должны сообщить угловую о любых изменениях, которые вы сделали. Есть несколько способов, чтобы исправить эту проблему:

Первый вариант:. Пробег $ Сфера $ применения() внутри обратного вызова, чтобы сообщить угловатые вы меняете вещи:

jQuery.ajax("/" 
    , { 
    async: true, 
    type: "POST", 
    } 
).always(function() { 
    $scope.apply(function() { 
    $scope.user.name = "Someone"; 
    alert($scope.user.name); 
    }) 
}); 

Второй вариант (предпочтительный): Заменить jQuery.ajax вызов с угловой встроенный в $http, который будет заботиться о $ применять шаг для вас:

app 
    .controller('MainController', function($scope, $http) { 
    $scope.user = { 
     name: "No one" 
    }; 

    $http({ 
     method: 'POST', 
     url: '/' 
    }, function(successResponse) { 
     $scope.user.name = successResponse.data.name; 
     alert($scope.user.name); 
    }); 
    }); 
2

Вы использовать JQuery вместо углового сервиса $ HTTP, чтобы сделать AJAX запроса, поэтому вы должны вручную вызвать $ объема. $ apply() после изменения области.

var app = angular.module('Async', []); 
 

 
app 
 
    .controller('MainController', function($scope) { 
 
    $scope.user = { 
 
     name: "No one" 
 
    }; 
 

 
    jQuery.ajax("/" 
 
     , { 
 
     async: true, 
 
     type: "POST", 
 
     } 
 
    ).always(function() { 
 
     $scope.user.name = "Someone"; 
 
     $scope.$apply(); 
 
     alert($scope.user.name); 
 
    }); 
 
    }); 
 

 
angular.bootstrap(document, ['Async']);
<div data-ng-controller="MainController"> 
 
    <div data-ng-view="">User's name: {{ user.name }}</div> 
 
</div> 
 

 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.js"></script> 
 
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular-route.js"></script>

Смежные вопросы