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;
};
}]);
使用下面的代码,我无法 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;
};
}]);