Примитивные типы в JS копируются по значению, объекты копируются по ссылке. Чтобы скоуп мог отслеживать изменения, копируйте в него ссылки на объекты, а не примитивные значения.
.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>
Подробности:
https://learn.javascript.ru/object-reference
learnwebtutorials.com/why-ng-model-value-should-co...
https://habrahabr.ru/post/182670/