AngularJS 10 $ digest () достигнуты итерации. Попытка синхронизировать службу, контроллер и представление с помощью $ watch работает, но вызывает ошибки

0

Хорошо, поэтому я знаю, в чем проблема. Я использую $ watch, и из-за значения, которое я устанавливаю (вызывая функцию в моей службе), каждый раз создается новый массив, и часы постоянно находят новое значение. Мой вопрос, однако, как это исправить. Моя текущая настройка подобна этой (только включая соответствующие части кода):

clientCtrl.js

.controller('ClientCtrl', function($scope, $ionicModal, $ionicPopup, $stateParams, clientService, opportunityService) {
  $scope.id = $stateParams.clientId;
  $scope.clients = clientService.getClients();
  $scope.opportunities = opportunityService.getOpportunities($scope.id);

  $scope.$watch(
    function(){ return opportunityService.opportunities },

    function(newVal) {
      $scope.opportunities = newVal;
    }
  );

opportunityService.js

.service('opportunityService', function($http) {
    this.getOpportunities = function(id) {
        this.results = [];
        if ( typeof id == 'undefined') {
            this.results = this.opportunities;
        }
        else {
            for (var a=0; a<this.opportunities.length; a++) {
                if (this.opportunities[a].clientId == id) {
                    this.results.push(this.opportunities[a]);
                }
            }
        }
        return this.results;
    };

Неэффективный код в сторону, в основном, что делается здесь, заключается в том, что служба получает объект JSON (не показан), который хранится в this.opportunities. Функция getOpportunities позволяет мне вернуть это контроллеру. По моему мнению, у меня есть список возможностей, где я могу добавлять, редактировать и удалять. Когда я добавляю новую возможность (через popup modal), она не отображается в представлении, пока я не перейду на другую страницу в своем приложении и не вернусь.

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

Есть ли лучший способ обновить мое представление, когда я добавляю элемент без необходимости перемещаться, имея в виду, что объект JSON, хранящий элементы, находится в сервисе, и полагается на передачу параметра ID?

Теги:
controller
service
watch
digest

1 ответ

0

Если я правильно понимаю ваш вопрос, вы должны использовать обещания вместо $ watch.

обслуживание

getOpportunities: function(id) {

    // $http.get returns a promise itself.
    // With the $q object you can write more complex code if needed
    var deferred = $q.defer();
        $http.get("/what/ever")
        .success(function(data) { 
            deferred.resolve(data);
        })
        .error(function() {
            deferred.reject("Oops");
        });
    return deferred.promise;
}

контроллер

var promise = opportunityService.getOpportunities($scope.id);
promise.then(
    function(p) { 
        $scope.opportunities = p.data;
    },
    function(data) {
        alert("error");
    });
};

Ещё вопросы

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