Вызовы API Angular.js — следует ли использовать фабрику?

Я работаю над приложением Electron, используя Trello API, Node.js (и пакет Node-Trello) и Angular.js (репозиторий github)

После того, как пользователь авторизует свое приложение Trello, я сохраняю некоторые данные профиля; некоторые из них представляют собой список идентификаторов всех их досок Trello.

У меня есть контроллер, который отображает список плат. В этом контроллере я извлекаю список идентификаторов плат из БД и получаю массив вроде

["893482938480", "0938492830"]

а затем я вызываю функцию, которой я передаю этот массив идентификаторов плат, например...

// get data for boards
$scope.get_board_data = function(boardIDArray) {
  for(var i = 0; i < boardIDs.length; i++){
    t.get("/1/boards/" + boardIDs[i], function(err, data) {
      if (err) throw err;
      board_info = data;
      board_names.push(board_info['name']);
      $scope.board_names = board_names;
      //console.log($scope.board_names);
      return $scope.board_names
    });
  }
}

$scope.board_array = $scope.get_board_data(boardIDs);

проблема в том, что если я console.log $scope.board_names вне функции, то я получаю undefined. НО если я войду внутрь функции, то получу нужные данные. Я немного застрял здесь. Любая помощь будет принята с благодарностью!

p.s. Я также пытался использовать $watch для $scope.board_names, но все равно получаю undefined. это я пробовал...

$scope.$watch('$scope.board_names', function(newValue, oldValue) {
  console.log('$scope.board_array: ' + newValue);
});

ИЗМЕНИТЬ похоже, что этот код работает; я изменил $scope.board_array = $scope.get_board_data(boardIDs); на просто $scope.get_board_data(boardIDs);, а затем, когда я нажимаю на пункт меню, представление, наконец, понимает, что есть данные для его использования.

Новый вопрос, как заставить представление получать эти данные при загрузке страницы?

Это должен быть завод? это то, для чего они используются?


person Banjerr    schedule 08.07.2016    source источник
comment
Эта функция находится в том же месте, где вы пытаетесь вызвать console.log? как это в контроллере?   -  person Dylan    schedule 08.07.2016
comment
Что такое переменная t.get? это пакет Angular $Http?   -  person Patrick Murphy    schedule 08.07.2016
comment
весь приведенный выше код внутри одного и того же контроллера. t.get — это объект Trello, созданный пакетом node-trello.   -  person Banjerr    schedule 08.07.2016


Ответы (2)


Я бы посоветовал вместо простой фабрики использовать ресурс. . Это специально созданные фабрики, созданные специально для обработки вызовов REST. Перейдите по этой ссылке ниже для получения дополнительной информации.

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

person Jon Black    schedule 08.07.2016

Фабрика:

(function () {
'use strict';
  angular
  .module('app')
  .factory('YourFactoryName', ['$http', function ($http) {
      //Add your other things you need to inject I don't know what your using. 
      //Probably pass your t object, or if you can inject it here, if it is in fact a service of its own
      var factory = {};
      factory.get_board_data  = function (boardIDArray) {
        for(var i = 0; i < boardIDs.length; i++){
          t.get("/1/boards/" + boardIDs[i], function(err, data) {
            if (err) throw err;
            board_info = data;
            board_names.push(board_info['name']);

            return board_names;
        });
      };
  };
  return factory;
  }]);
}())

Назовите это с помощью $scope.board_array=YourFactoryName.get_board_data();

Вы можете вызвать это в начале вашего контроллера, если хотите, чтобы он загружался сразу.

person Dylan    schedule 08.07.2016