【问题标题】:Why use .factory in AngularJS instead of declaring as a variable?为什么在 AngularJS 中使用 .factory 而不是声明为变量?
【发布时间】:2014-07-21 12:50:05
【问题描述】:

目前正在学习 Javascript 和 Angular JS。我想看看我是否可以不使用 .factory,只需声明它作为变量返回的内容,然后引用它。

为什么我必须使用工厂而不是仅仅声明它作为函数返回的内容?有没有办法绕过它。

JAVASCRIPT 代码 1(我的代码):http://jsfiddle.net/chrisguzman/s4dBE/4/

  myapp.controller("SampleController",
    function SampleController($scope,$firebase){
        var ref = new Firebase("https://helloworldtest.firebaseio.com/text");
        var service = $firebase(ref);
        service.$bind($scope, "text");
    })

JAVASCRIPT 代码 2(原始代码):http://jsfiddle.net/chrisguzman/s4dBE/3/

angular.module("sampleApp", ["firebase"])
  .factory("sampleService", ["$firebase", function($firebase) {
    var ref = new Firebase("https://helloworldtest.firebaseio.com/text");
    return $firebase(ref);
  }])
  .controller("SampleController", ["$scope", "sampleService",
    function($scope, service) {
      service.$bind($scope, "text");
    }
  ]);

额外问题:有没有其他方法可以以不同的方式编写第二个代码脚本。我问的原因是因为它有助于进一步理解它。特别是,我希望看到在不使用工厂的情况下完成相同的任务,如果看到一个函数作为控制器的第二个参数(因为这是已经公开的),那就太棒了。

【问题讨论】:

  • 大多数人都有相反的问题...如何从控制器中获取数据以在其他地方使用。您的应用显然不是很复杂,否则您会喜欢将其留在工厂中

标签: javascript angularjs firebase factory angularfire


【解决方案1】:

工厂的重点是为您的数据提供一个单一的源点,您可以将该工厂注入其他控制器。您必须在要使用的每个控制器中复制 Firebase,而不是仅仅注入工厂。对于一个简单的单控制器应用程序,这并不是什么问题,但随着应用程序的增长,这将成为一个大问题。

使用工厂的一个示例:

var app = angular.module('firebaseApp',['firebase']);

app.factory('FBService',function($firebase) {
    var firebase_url = "https://helloworldtest.firebaseio.com/";

    return {
        ref: function(ref_path) {
            var new_ref = new Firebase(firebase_url + '/' + ref_path + '/');
            return $firebase(new_ref);
        }
    }
});

app.controller('List1Ctrl',function($scope,FBService) {
    $scope.list1 = FBService.ref('list1');
});

app.controller('List2Ctrl',function($scope,FBService) {
    $scope.list2 = FBService.ref('list2');
});

【讨论】:

  • 工厂不是单身吗?因此,无论注入的时间如何,它都应该解析为单个实例。对吗?
  • @David,是的,服务是单例的,但是,您可以修改它们的变量,如上面编辑的答案所示。此外,如果您需要更多信息,这可能会有所帮助:angular-tips.com/blog/2013/08/understanding-service-types
  • 啊,我明白了。我的困惑来自于我将新的 Firebase 实例作为私有字段放置在我的工厂中。然后我使用一个瘦 API 从他们那里获取数据。一种不太灵活的方法,但提供了 Firebase 实例的重用。
  • 是的,可能有更好的方法来处理这个问题,但这只是可重用服务的一个示例。
  • 只要你不把所有东西都砸在 $scope 上,我就很高兴。
猜你喜欢
  • 1970-01-01
  • 2019-11-04
  • 1970-01-01
  • 2022-11-27
  • 2016-04-23
  • 1970-01-01
  • 2016-07-03
  • 2019-07-17
  • 1970-01-01
相关资源
最近更新 更多