2015-02-05 35 views
1

我們試圖鎖定使用服務的最佳方法,並提出了三種可能性。這是一個更大問題的小例子,但我希望它可以得到一個點。在這些例子中的服務是非常簡單的:使用/實現服務的正確方法

.service("markerService", function(){ 
    var self = this; 
    self.showMarkers = false; 
    self.toggleMarkers = function(value){ 
     self.showMarkers = angular.isDefined(value) ? !!value : !self.showMarkers; 
    }; 
}) 

而且它編譯後的DOM也很簡單:

<div ng-controller="ParentCtrl" class="ng-scope"> 
    <div class="assetsDirective"> 
     <div> 
      <div class="assetDirective">Hidden Name: 1</div> 
      <div class="assetDirective">Hidden Name: 2</div> 
     </div> 
    </div> 
    <div class="toolBarDirective"> 
     <div> 
      <button>Toggle Markers</button> 
     </div> 
    </div> 
</div> 

我們已經想出的選項有:

  1. 選項A:http://jsfiddle.net/nxhn31yv/(資產和工具欄都有服務)
  2. 選項B:http://jsfiddle.net/oszop5j4/(資產有服務,工具欄的父服務和工具欄的更新吧)
  3. 選項C:http://jsfiddle.net/a7nf31d3/(所有的家長都有服務,通過它)

第一個注入服務器分爲兩個兄弟控制器,其中一個調用切換功能更新存儲在該服務中的值。

第二個選項將它注入到具有父/子關係的兩個服務中。父進程將值傳遞給一個可以更新它的子進程(比如ngmodel),而帶有注入服務的子控制器將其值傳遞給使用它的子進程。

第三種選擇是讓父母將值全部傳遞給兩個兄弟姐妹,後者又將一個兄弟傳遞給它的孩子。

其中哪些符合angulars如何實施服務的方法論?

+1

我不知道,如果你的實際使用情況是不同的,但共享控制器和指令之間的信息,我會使用的範圍,而不是!根範圍中的showMarkers布爾值將比這裏的服務更好。 – flup 2015-02-19 08:25:50

回答

1

根據臨JavaScript開發通過傳奧德爾, 應用一組方法性質從一個對象直接到另一個或一類的原型可以是「劈「,特別是那些接觸Angular的開發人員,從面向對象的背景。 Neverthless,當它被仔細使用時,可以簡化開發和代碼維護。 這是一個mixin設計模式,其中避免了擴展子類和繼承鏈

將服務注入到封裝的指令中,將有助於避免父控制器和繼承。 這就是爲什麼我選擇選項A,但仔細使用它。

More關於mixin。

Another文章

2

我會說選項A是最好的辦法。

我相信Angular教你的最重要的事情之一就是如何模塊化你的代碼。用這種方式進行編程,如果你願意,你可以刪除,在任何地方添加任何部分。因此,你會盡量避免使用任何依賴於另一部分的東西。您的選擇A以這種方式成功。

當然有時它是不可避免的,但我用它作爲一般規則。它使事情變得更容易理解和遵循,保持事情的清潔。

編輯:它也保護你自己免受未來範圍的變化。

5

選項A對我來說是明顯的贏家。它更接近離散的,分離的Web組件的概念 - Angular和Web開發通常似乎正在走向的方向。

對於Angular 1.x,這意味着使用指令來封裝綁定在一起的所有標記/邏輯。通常不需要標記中的ng-controller。應該可以通過僅查看該指令的聲明來識別任何指令的依賴性(注入或相關指令)。選項B和C違反了這些簡單原則,因此(假設實際實現比這些簡單示例更復雜)在維護和調試方面可能會更加痛苦。