Angular JS工厂澄清

时间:2015-05-13 19:41:35

标签: angularjs

所有这些工厂定义之间有什么区别

app.factory('myFirstFactory', function () {

    var customShow = function () {
        return "My First Factory";
    }

    return customShow;

});



app.factory('mySecondFactory', function () {
    return {
        show: function () {
            return "My Second Factory";
        }
    }
});

app.factory('myThirdFactory', function () {
    function myCustomShow() { 
        return "My Third Factory";
    }
    return {
        show: myCustomShow
    }
});

以下是它在控制器中的调用方式。定义工厂的理想情况是什么?工厂的实际退货类型是什么?在一个定义中,工厂和服务似乎看起来很相似。有人可以澄清一下

$scope.message1 = myFirstFactory();
$scope.message2 = myService.show();
$scope.message3 = mySecondFactory.show();
$scope.message4 = myThirdFactory.show();

2 个答案:

答案 0 :(得分:1)

第一个返回customShowcustomShow被声明为函数。所以这个工厂返回的服务是一个功能。因此,当您在控制器或其他服务中注入myFirstFactory时,注入的值将是一个函数。顺便说一句,你不应该选择xxxFactory作为名称。由于工厂的原因,您定义的组件是服务,而不是工厂。注入的是退回的服务,而不是工厂。

第二个和第一个都返回一个对象:

return {
    show: ...
}

因此,在这两种情况下注入的是一个对象,而不是像第一种情况那样的函数。

返回的对象有一个名为show的字段,它是一个函数。第二个定义命名函数,并将此命名函数分配给返回对象的show属性,而第三个函数直接将匿名函数分配给返回对象的show属性。但最终结果是一样的。您将看到的唯一区别是打印(用于调试)函数本身时:

console.log(theService.show);

将打印

function myCustomShow() { ... }

为第二个,但将打印

function () { ... }

第三个。

答案 1 :(得分:0)

所有关于如何处理工厂界面的偏好。另一点是最佳实践。第三个是John Papa在其详细的angular-styleguide中提出的,尽管由于可读性,他将界面置于顶部而不是所有功能之下。它实际上是由Revealing Module Pattern推导出来的。

如果工厂只返回一个函数,第一个让我想起了一个类定义。因此,当您将其注入控制器时,必须按如下方式调用它:

function MyController($scope, myFirstFactory)
{
    // $scope.myFirstFactory would print out "My First Factory"
    $scope.myFirstFactory = myFirstFactory();
}

如果您计划编写面向对象的AngularJS服务,通常会使用此方法,因为工厂可用于定义可以使用new关键字多次实例化的类,而服务始终会创建单例。

app.factory('MyFirstFactory', function() {
    var privateVariable = 'foo';

    // Constructor
    var MyFirstFactory = function(bar) {
        this.bar = bar;
    };

    MyFirstFactory.prototype.showCustom = function() {
        return "My Third Factory";
    };

    return MyFirstFactory;
});

然后您可以创建许多实例,如下所示:

function MyController($scope, myFirstFactory)
{
    // $scope.myFirstFactory would print out "My First Factory"
    $scope.myFirstFactory = new MyFirstFactory();
    $scope.showCustom = myFirstFactory.showCustom();
}

第二个是第三个变体,它都返回一个对象,如@ jb-nizet所述。

相关问题