使用下面的代码我不能将对象返回到工厂中的返回值,随后在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();
});
答案 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;
};
}]);