所有这些工厂定义之间有什么区别
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();
答案 0 :(得分:1)
第一个返回customShow
。 customShow
被声明为函数。所以这个工厂返回的服务是一个功能。因此,当您在控制器或其他服务中注入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所述。