2015-05-13 92 views
0

是什麼角JS廠澄清

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(); 

回答

1

第一個返回customShowcustomShow被聲明爲一個函數。所以這個工廠返回的服務是一個函數。因此,當您在控制器或其他服務中注入myFirstFactory時,注入的值將是一個函數。順便說一句,你不應該選擇xxxFactory作爲名稱。您所定義的組件,由於工廠,是一種服務,而不是工廠。注入的是返回的服務,而不是工廠。

第二個和口渴一個都返回一個對象:

return { 
    show: ... 
} 

那麼會在兩種情況下被注入是一個對象,而不是像在第一種情況下的功能。

返回的對象有一個名爲show的字段,它是一個函數。第二個定義了一個命名函數,並將該命名函數分配給返回對象的show屬性,而第三個函數直接將匿名函數分配給返回對象的show屬性。但最終的結果是一樣的。你會看到唯一的區別是打印時(調試)函數本身:

console.log(theService.show); 

將打印

function myCustomShow() { ... } 

的第二個,但將打印

function() { ... } 

爲第三個。

+0

謝謝Nizet。結合更多查詢。在第二個工廠中,匿名函數被分配來顯示並返回。如果你看看它在控制器中被調用的方式,它只是工廠的名稱。 但在第三個工廠中,我們正在爲顯示屬性分配一個命名函數。我不知道如何爲.net背景指定一個命名函數屬性,因此我可以爲您解釋它。在此先感謝 – TechQuery

+0

當您正在執行命名函數聲明時,您可以通過其名稱引用此函數,就好像它已分配給變量一樣。 –

+0

爲進一步詢問而道歉 在這種情況下,它將賦值賦給變量名。rit ?? /這種方法的好處是什麼。它被稱爲什麼。 function myCustomShow(){ return「My Third Factory」; } return { 顯示:myCustomShow } – TechQuery

0

這是關於如何處理工廠界面的偏好。另一點是最佳實踐。第三個是約翰帕帕在他詳細的angular-styleguide中提出的,即使他將界面放在頂部而不是所有功能都由於可讀性。它實際上是由Revealing Module Pattern派生的。

如果工廠只返回一個函數,第一個提醒我定義了一個類的定義。因此它有,當你把它注射到控制器中進行如下調用:

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

,如果你打算編寫面向對象的AngularJS服務這通常使用,因爲工廠是定義一個類,您可以實例有用很多次使用新的關鍵字,而服務總是創建單身。

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的變化。

+0

謝謝,我只是看了博客,我只是修改它。在下面的代碼中,實際的函數定義包含在customshow中,但爲什麼我們將它指定爲show和rahter而不是直接調用「customshow」,我們稱之爲「Show」。我很確定我錯過了這裏的基本知識,但如果你能解釋,這將是偉大的 var service = {0}顯示:CustomShow }; 退貨服務; – TechQuery

+0

變量'service'實際上就是接口。這是「揭示模塊模式」的一部分。它使讀取代碼更容易,並允許以更結構化的方式組織它。這裏另一個重要的事實是傳遞值和傳遞引用的概念。假設你有一些沒有在'service'對象中定義的變量,並且在工廠外部使用這個變量並將它傳遞給一個函數,那麼這個變量是通過值傳遞的,所以任何操作都不會影響函數之外的變量。 [見下一評論]。 – LordTribual

+0

反之,對象內的變量通過引用傳遞,所以對工廠外的函數進行的任何修改都會對該對象產生影響,因爲它實際上是一個引用。當然,這取決於你想達到什麼,但我想在大多數情況下,對象表示(接口符號)是一個很好的方法。 – LordTribual