Прежде всего, я извиняюсь заранее, если моя терминология или подход не работает - я исхожу из структурного инженерного фона и пытаюсь изучить 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);
Здесь плункер похож на код выше.
вы можете использовать функцию 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
вы можете выполнять все ваши пересчеты внутри.
Вот рабочий пример.