Повторно вызвать функцию обновления модели в AngularJS

0

Прежде всего, я извиняюсь заранее, если моя терминология или подход не работает - я исхожу из структурного инженерного фона и пытаюсь изучить javascript и AngularJS через небольшой проект для домашних животных.

Мой вопрос: как мне повторно вызвать функцию updateMe() внутри службы всякий раз, когда модель обновляется. Ниже приведен пример кода и плунжера.

Первоначально этот код будет работать нормально, и результат будет рассчитан. Если a или b обновлены, их обновленные значения распространяются на все контроллеры, но значение result не обновляется.

Я пробовал играть с $scope.$watch() но я не мог заставить его работать, и я уверен, что это правильный подход.

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

angular
   .module('app', []);

//some function to be evaluated when the data in myservice changes
function updateMe(x, y) {
  return x * y;
}

//Define a service (to provide data to multiple ctrls)
function MyService() {
   var myservice = this;
   myservice.a = 2;
   myservice.b = 5;
   // I am trying to get 'result' to update when any of the input parameters update
   myservice.result= updateMe(myservice.a, myservice.b); 
}
angular
  .module('app')
  .service('myservice', MyService);

// Controller that uses myservice data in the view
function FirstCtrl(myservice) {
   var vm = this;
   vm.myservice = myservice;

}
angular
   .module('app')
   .controller('FirstCtrl', FirstCtrl);

// Another Controller that uses myservice data in the view      
function SecondCtrl(myservice) {
   var vm = this;
   vm.myservice = myservice;
}
angular
   .module('app')
   .controller('SecondCtrl', SecondCtrl);

Здесь плункер похож на код выше.

Теги:
data-binding
service

1 ответ

0
Лучший ответ

вы можете использовать функцию ng-change для пересчета значений

<input type="number" step="1" ng-model="first.myservice.a" ng-change="first.myservice.updateAll(first.myservice.a)">


  myservice.updateAll=function()
 {
   myservice.result = updateMe(myservice.a, myservice.b);
 }

Всякий раз, когда в вашей модели есть updateAll триггеры updateAll вы можете выполнять все ваши пересчеты внутри.

Вот рабочий пример.

  • 0
    Спасибо за вашу помощь! Это решение работает в моем приложении, и теперь я в режиме реального времени вижу мои данные! Хотя я уверен, что есть способ заставить $ scope. $ Watch работать, это, кажется, самый чистый путь.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню