R
R
Roman Rodionov2016-09-09 04:39:55
Angular
Roman Rodionov, 2016-09-09 04:39:55

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

1 answer(s)
N
napa3um, 2016-09-09
@Romashishka

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>

Details:
https://learn.javascript.ru/object-reference
learnwebtutorials.com/why-ng-model-value-should-co...
https://habrahabr.ru/post/182670/

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question