Angular:将控制器更改为工厂

时间:2015-01-03 23:07:20

标签: javascript angularjs mongodb

使用下面的代码我不能将对象返回到工厂中的返回值,随后在html中有空白字段,带有角度误差。

  

提供商'服务'必须从$ get factory方法返回一个值。

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

我可以在控制器内查询数据库,以显示,过滤网页的数据等,但是想将此代码更改为Angular工厂,以便我可以跨多个控制器进行同步。  虽然我能够使用虚拟数据将数据从工厂返回到控制器,但我无法返回' 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();
});

1 个答案:

答案 0 :(得分:0)

这里的控制器,不知道你在哪里定义collection变量,但最好将值传递给工厂

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

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

将工厂用作global函数(或类构造函数

更好
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;                
    };
}]);