角度.js API 调用 - 我应该使用工厂吗?



我正在开发一个Electron应用程序,利用Trello API,Node.js(和Node-Trello包)和Angular.js(github存储库)

在用户授权他们的Trello应用程序后,我保存了一些个人资料数据;其中一些是他们所有Trello板的ID列表。

我有一个控制器来处理显示他们的板列表。在这个控制器中,我从数据库中提取板 ID 列表并得到一个数组,例如

["893482938480", "0938492830"]

然后我调用一个函数,我将这个板 ID 数组传递给它,就像这样......

// 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.但是如果我登录函数,那么我会得到所需的数据。我有点被困在这里。任何帮助将不胜感激!

附言我也尝试在$scope.board_names上使用$watch,但我仍然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);,然后当我单击菜单项时,视图最终意识到有数据可供其使用。

新问题如何使视图在页面加载时获取此数据?

这应该是一个工厂吗?这就是它们的用途吗?

我建议不要使用普通工厂,而是使用资源。 它们是专门为处理 REST 调用而专门创建的工厂。 查看下面的此链接以获取更多信息。

资源不仅是专门为此制作的,而且还允许您创建一个集中式系统,允许您根据需要轻松添加更多 REST 调用。

工厂:

(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();来称呼它

如果您希望立即加载控制器,可以在控制器的开头调用它。

最新更新