Angular:将控制器更改为工厂

Angular: Changing controller to a factory

使用下面的代码,我无法 return 工厂中 return 值的对象,随后在 html 中有空白字段,并出现 angular 错误。

Provider 'theService' must return a value from $get factory method.

我正在使用 TingoDB(Mongo 的 javascript 版本)和 Angular 在 Node-Webkit 中进行数据绑定来开发单页应用程序。

我可以从控制器中查询数据库以显示、过滤网页数据等,但想将此代码更改为 Angular 工厂,以便我可以在多个控制器之间进行同步。 尽管我能够使用虚拟数据 return 从工厂向控制器发送数据,但我无法 return 'live' 来自数据库的数据。

以下代码用作控制器:

app.controller('MyCtrl', ['$scope', function($scope) {
function getData(callback) {
    collection.find( {} ).toArray(function(err, docs) {
          $scope.$apply(function () {
            callback(docs);
          });
        });  
}

function info(b) {
    // console.log(b);
    $scope.items = b;
}

getData(info);

}]);

将其更改为工厂无效:

    app.factory("theService", function($scope) {
    function getData(callback) {
        collection.find( {} )).toArray(function(err, docs) {
              $scope.$apply(function () {
                callback(docs);
              });
            });  
    }

    function info(b) {
        // console.log(b);
        $scope.users = b;

        return {
            all: $scope.users,
            first: $scope.users[0]
        }
    }   
    getData(info);  
});

控制器:

app.controller("MyCtrl", function($scope, theService) {
  $scope.users = theService.all();
});

这里是controller,不知道你在哪里定义collection变量,不过最好是传值给factory

app.controller('MyCtrl', ['$scope','getData', function ($scope, getData) {  
    $scope.items = [];

    getData(collection).then(function(items) { // pass "collection" to the factory
        $scope.items = items;
    });
}]);

最好将工厂用作global函数(或class构造函数

app.factory('getData', ['$q', function ($q) { // you can't inject $scope to the factory        
    return function getData(collection) {
        var defer = $q.defer(); // let's make it work more in angular way, use promises

        collection.find({}).toArray(function (err, docs) {
            if (err) { // fixme - don't really know how to handle exception here
                defer.reject(err);
            } else {
               defer.resolve(docs);
            }            
        });

        return defer.promise;                
    };
}]);