AngularJS – фабричная переменная не обновляется в контроллере

У меня возникла новая проблема с AngularJS. На самом деле, поскольку мне нужна «общая» переменная, доступная для чтения и обновления в 2 контроллерах, я подумал о том, чтобы сделать это с фабрикой, введенной в оба контроллера. Данные загружаются через http-запрос, но после завершения запроса var просто не обновляется. Вот мой код:

  //Common factory
  app.factory('CurrentGallery',['$q','$http',function($q,$http){
    var data = null;

    //HTTP request to API
    var loadImages = function(query){
      $http.post("https://mywebsite.com/api/?"+query).then(function(result){
        update(result.data);
      });
    }

    //Update the data var
    var update = function(data){
      data = data;
      console.log("Update called", data);
    }

    return {
      loadImages: loadImages,
      update: update,
      data: data
    }
  }]);

  //The controller
  app.controller("PhotoBestController", ['$scope', 'CurrentGallery', function ($scope,CurrentGallery) {
    //$scope.pics is basically the variable I want to update inside my controller
    $scope.pics = CurrentGallery.data;

    //Send the data of the query for the API
    CurrentGallery.loadImages("userInfo=true&exifInfo=true&order=tot_like,DESC");

    $scope.$watch(CurrentGallery, function(){
      console.log("CurrentGallery has changed");
    });
  }]);

Это журнал, который я получаю в своей консоли:

  • Текущая галерея изменилась
  • Обновление вызвано, Объект {...}

Таким образом, кажется, что CurrentGallery обновляется в самый первый раз, когда он равен нулю, но затем, даже если он обновляется внутри фабрики, он не обновляет переменную $scope.pics.

Какие-либо предложения?


person Wendigo    schedule 20.01.2017    source источник
comment
это может помочь вам: /а>   -  person Vinod Louis    schedule 20.01.2017
comment
@VinodLouis, похоже, это не решает проблему! Это дает точно такой же результат, поэтому ничего не обновляется   -  person Wendigo    schedule 20.01.2017


Ответы (2)


ОБНОВЛЕНИЕ
Я следовал логике кода в этой теме: AngularJS: как смотреть служебные переменные?

app.factory('CurrentGallery',['$q','$http',function($q,$http) {
  var updateCallbacks = [];
  var data = null;

  var loadImages = function(query) {   
    $http.post("https://mywebsite.com/api/?"+query).then(function(result) {
      angular.forEach(updateCallbacks, function(callback) {
        callback(result.data);
      });
    });
  }

  var registerUpdateCallback(callback) {
    updateCallbacks.push(callback);
  }

  return {
    loadImages: loadImages,
    registerUpdateCallback: registerUpdateCallback
  }
}]);

app.controller("PhotoBestController", ['$scope', 'CurrentGallery', function($scope,CurrentGallery) {      
  CurrentGallery.registerUpdateCallback(function(data) {
    console.log("updated")
  });
  CurrentGallery.loadImages("userInfo=true&exifInfo=true&order=tot_like,DESC");
}]);
person IzumiSy    schedule 20.01.2017
comment
Да, я думал об этом, но в случае, если я использую промис, как я могу обнаружить изменение потенциального второго контроллера, с которым я хочу поделиться var CurrentGallery.data? - person Wendigo; 20.01.2017

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

Итак, когда вы помещаете часы в свой контроллер, переназначайте переменную области видимости:

$scope.$watch(CurrentGallery, function(){
      $scope.pics = CurrentGallery.data;
      console.log("CurrentGallery has changed");
});
person sonu singhal    schedule 20.01.2017
comment
Это то, что я сделал, но это даже не сработало, журнал CurrentGallery изменился - person Wendigo; 20.01.2017
comment
Это не обязательно, это было в вашем коде, который вы разместили, поэтому я сохранил его здесь. Так получилось или нет. - person sonu singhal; 20.01.2017