Answer the question
In order to leave comments, you need to log in
Why doesn't the controller see the data change in the service?
.controller("RegistrationCtrl", function ($scope, UserService){
$scope.regMessage = UserService.regResp;
$scope.addUser = UserService.add;
})
.service("UserService", function ($http){
this.regResp = "Hello";
this.add = function(){
var o = this;
$http.get("api/register").then(function (response){
o.regResp = response.data.message; // здесь меняется значение переменной regResp, и должно поменяться значение regMessage в контроллере, но этого не происходит.
});
}
});
<div ng-controller="RegistrationCtrl">
<span>{{regMessage}}</span>
</div>
Answer the question
In order to leave comments, you need to log in
Primitive types in JS are copied by value, objects are copied by reference. In order for the scope to track changes, copy object references to it, not primitive values.
.controller("RegistrationCtrl", function ($scope, UserService){
$scope.regMessage = UserService.regResp; // тут в переменную $scope.regMessage копируется _примитивное_значение_ переменной UserService.regResp, при обновлении UserService.regResp переменная $scope.UserService не изменится; не будем использовать эту переменную
$scope.UserService = UserService; // тут в переменную $scope.UserService копируется _ссылка_на_объект, на который ссылается переменная UserService, при обновлении объекта по обоим переменным теперь можно увидеть изменения
$scope.addUser = UserService.add;
})
.service("UserService", function ($http){
this.regResp = "Hello";
this.add = function(){
var o = this;
$http.get("api/register").then(function (response){
o.regResp = response.data.message;
});
}
});
<div ng-controller="RegistrationCtrl">
<span>{{UserService.regResp}}</span>
<!-- простое правило: если в биндинге есть точка, то биндинг может отслеживать изменения, произведённые и извне контроллера, привязанного к данному скоупу -->
</div>
Didn't find what you were looking for?
Ask your questionAsk a Question
731 491 924 answers to any question