Привязать свойство сервиса к контроллеру AngularJS - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь постоянно обновлять мое значение в контроллере.Может заставить это работать с начальным значением свойства, но это не обновляет позже.Я пробовал так много способов сделать это и прошел через множество потоков, но я не могу заставить его работать ... Я уже почти разочаровался в этом, поскольку я не знаю, в чем проблема.

Я стараюсь избегать использования вещания как можно чаще в этой ситуации.Вы можете заметить что-то очевидное, что я делаю не так?

angular.module('app',[])

.controller('mainCtrl', function(userService) {
  var vm = this;
  
  vm.livePropertyFromService = userService.getValue('property');

  vm.incrementServiceProperty = function() {
    userService.update('property', userService.user.property + 1);
    console.log('userService.user.property = ', userService.user.property);
  }
  
})

.service('userService', function($window) {
  var service = this;
  service.user = {
    property: 0
  };
  
  service.update = function(propertyName, property) {
    service.user[propertyName] = property;
  };
  
  return {
    update: function(propertyName, property) {
      service.user[propertyName] = property;
    },
    getValue: function(key) {
      return service.user[key];
    },
    user: service.user
  }
});
<html ng-app="app">
 <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.5/angular.min.js"></script>
 </head>
 <body>
    <div ng-controller="mainCtrl as vm">
      <button ng-click="vm.incrementServiceProperty()">Increment property</button>
      <span ng-bind="vm.livePropertyFromService"></span>
    </div>
  </body>
 </html>

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Я на самом деле работал сам через несколько минут после публикации этого сообщения, где я пытался заставить его работать весь вчерашний вечер ...

Я заменил vm.livePropertyFromService объектом, а несвойство объекта обслуживания.От vm.livePropertyFromService до vm.user, присвоенный ему userService.user, а затем в HTML-коде ссылаются на vm.user.property!Он волшебно работает как шарм.

angular.module('app',[])

.controller('mainCtrl', function(userService) {
  var vm = this;
  
  vm.user = userService.user;

  vm.incrementServiceProperty = function() {
    userService.update('property', userService.user.property + 1);
    console.log('userService.user.property = ', userService.user.property);
  }
  
})

.service('userService', function($window) {
  var service = this;
  service.user = {
    property: 0
  };
  
  service.update = function(propertyName, property) {
    service.user[propertyName] = property;
  };
  
  return {
    update: function(propertyName, property) {
      service.user[propertyName] = property;
    },
    getValue: function(key) {
      return service.user[key];
    },
    user: service.user
  }
});
<html ng-app="app">
 <head>
    <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.7.5/angular.min.js"></script>
 </head>
 <body>
    <div ng-controller="mainCtrl as vm">
      <button ng-click="vm.incrementServiceProperty()">Increment property</button>
      <span ng-bind="vm.user.property"></span>
    </div>
  </body>
 </html>
0 голосов
/ 15 февраля 2019
vm.incrementServiceProperty = function() {
    userService.update('property', userService.user.property + 1);
    vm.livePropertyFromService = userService.getValue('property');

    console.log('userService.user.property = ', userService.user.property);
}

И

<span>{{vm.livePropertyFromService}}</span>

Должен это сделать!

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...