0

几天后,我通过将我的标准 JS 应用程序转换为 ng 应用程序来学习 angularJS。我想知道这个简单的场景:

我有一个名为 fb_connect() 的全局函数,它可以从任何页面(或任何控制器,如果你喜欢的话)用于进行基于 facebook 的登录。此函数进行简单的 http 调用并接收一个 JSON 对象,其中包含要继续前进的数据(显示弹出窗口、登录等...)

我读到我可以为我的应用程序定义一个工厂或服务,并在任何控制器中使用它,效果很好。所以,我创建了一个 fb_connect 工厂函数。问题是现在,在每个页面(每个控制器)中,我必须在每个控制器的构造函数中定义fb_connect - 例如:

function welcome($scope,fb_connect){});

使用 Angular 执行此类操作而不必每次都在每个控制器中定义这些函数的正确方法是什么?

谢谢

4

3 回答 3

1

设置工厂和服务都是Angular依赖注入系统的一部分。当您需要创建依赖于其他注入事物的事物时,使用该系统非常棒。这是一个很大的依赖树。创建单例也很好,这样代码中的任何地方最终都会使用某个对象的相同实例。

在我看来,这些好处都不适用于您的情况。我建议不要使用 Angular 的 DI。您有一些全局定义的函数,只需直接调用它并跳过 DI。这没什么不好。

当然你说它会进行 Ajax 调用,所以不依赖于 Angular 的 $http 服务?

于 2013-06-29T21:27:48.857 回答
0

您的两个选择是:

  • 在上面声明函数$rootScope
  • 将其作为服务注入

我的建议是让它成为一项服务。Angular.js 文档中解释了服务的全部目的,就像这句话:

Angular 服务是执行 Web 应用程序常见的特定任务的单例...要使用 Angular 服务,您将其标识为依赖于该服务的依赖项(控制器或其他服务)的依赖项。

正如您在问题中提到的那样,您不希望在您希望使用它的每个控制器中定义服务。$rootScope您还将在每个控制器中注入它。所以实际上这是您更喜欢的问题,尽管要回答您的问题,使用工厂或服务的正确方法是将其注入您希望使用它的控制器中。

于 2013-06-30T05:33:53.933 回答
0

你总是可以把它放在 $rootScope

myApp.run(function($rootScope, fb_connect){
  $rootScope.welcome = function(){

  };
});
于 2013-06-30T02:12:23.110 回答