如何在angular.js中为服务注入依赖项?

时间:2014-08-16 23:06:56

标签: angularjs angularjs-service

我正在使用AngularFire创建一个Web应用程序。我的几个控制器使用许多相同的功能来访问Firebase中的数据,因此我尝试编写一个服务,这样我就不必为每个控制器重写相同的功能。问题是我似乎无法将Firebase依赖项纳入服务。我正在使用以下代码:

angular.module("myApp", ["firebase","ngDraggable"])

.factory("GetData",['$firebase','FirebaseConn',function($firebase,FirebaseConn){
    $firebase(new Firebase("https://XXXX.firebaseio.com/")).$asObject().$bindTo(scope, "firebaseData");
    return {

    };
}]);

但是当我尝试运行它时,我收到以下错误:

Unknown provider: FirebaseConnProvider <- FirebaseConn

我可以通过我的控制器访问Firebase,因此连接到firebase.jsangularfire.js并不是问题。

如何将Firebase注入我的服务中,以便我可以访问所有控制器中的数据?或者,有更好的方法来解决这个问题吗?我对Angular很新,所以如果有更好的方法在我的控制器之间共享功能,那我就听见了。

1 个答案:

答案 0 :(得分:1)

您按照与控制器和指令相同的方式注入

这是AngularJS中的一个常见错误,它意味着您注射了一些不可注射的东西。它几乎总是意味着你错过了一个依赖(可能不是在这种情况下)或者你要求的东西一开始就不存在。

这几乎可以肯定是你的问题。您要求firebase并获取它,但它无法找到FirebaseConn。那是什么,你用来跟踪你的连接的你的一些变量?因为你没有使用它,而AngularFire文档我也只是看过了。

考虑更多如下内容:

angular
    .module("myApp", ["firebase", "ngDraggable"])
    .service("firebaseManager",['$firebase', function($firebase) {
        var ref = new Firebase("https://XXXX.firebaseio.com/"),
            sync = $firebase(ref);

        this.getData = function() {
            return sync.$asObject();
        };
    });

显然,定制这个以适应。两条评论:

  1. 您可能需要服务而不是工厂。当您第一次开始使用AngularJS时,这是一个常见的混淆点。如果您计划以某种方式参与服务的实例化,则只需要工厂。服务只是工厂的一种快捷形式,具有最常见的用途 - 您可能想要的那种。

  2. 您现在将此服务firebaseManager注入您的控制器。当您这样做时,他们将能够调用firebaseManager.getData()以及您定义的任何其他方法。 firebaseManager将是一个单身人士,因此所有这些都将通过一个常见的Firebase连接。