角度依赖注入 - 不实例化工厂/未定义工厂

时间:2014-07-13 13:24:52

标签: javascript angularjs firebase angularfire

我完全不知道自己试图在我的控制器中实例化一个工厂。无论我做什么,似乎我的工厂(' 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');

..... 

1 个答案:

答案 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