我完全不知道自己试图在我的控制器中实例化一个工厂。无论我做什么,似乎我的工厂(' FBRetrieve')都是未定义的。它必须非常简单,但似乎无法通过S / O搜索/ google / angulardocs找到解决方案。
app.js
var legalmvc = angular.module('legalmvc', ['ngRoute','FireBaseService']);
factory.js
angular.module("FireBaseService", []).factory('FBRetrieve', function(){
var biblioData = new Object();
biblioData.getData = function(type){
var biblioRef = new Firebase('https://legalcitator.firebaseio.com/'+type);
biblioRef.on('value', function(data) {
if (data.val() === null) {
console.log("ERROR");
return;
}
console.log(data.val());
biblioData = data.val();
});
return biblioData;
};
});
并且在控制器中我用这样的东西进行实例化:
legalmvc.controller('FormCtrl',["$scope","FBRetrieve", function ($scope, FBRetrieve) {
$scope.FBRetrieve = FBRetrieve.getData('case');
.....
答案 0 :(得分:3)
getData
是异步操作,这意味着当您尝试返回时,响应尚不可用。相反,你应该使用延迟模式的回调(在这种情况下更自然):
biblioData.getData = function(type) {
var biblioRef = new Firebase('https://legalcitator.firebaseio.com/'+type),
deferred = $q.defer(); // remember to inject $q service into factory
biblioRef.on('value', function(data) {
if (data.val() === null) {
deferred.reject('ERROR');
}
deferred.resolve(data.val());
});
return deferred.promise;
};
然后你会在控制器中使用它:
FBRetrieve.getData('case').then(function(data) {
$scope.FBRetrieve = data;
}, function() {
// handle error
});
还要了解这个常见的problem and solution。