2016-02-04 193 views
0

小提琴:https://jsfiddle.net/ahmadabdul3/L3eeeh6n/角度循環依賴解決方案

我正在構建一個應用程序。這個應用程序開始我可以添加到一些靜態數據,從中刪除。我遇到的問題(循環依賴)來自這個最初的靜態數據。這裏是場景:

我有2個服務(水果,籃子)。每個水果只能屬於一個籃子,但每個籃子可以容納許多水果。這兩個服務(下)取決於對方:

function fruitService() {} 
function basketService() {} 

他們互相依賴,因爲最初的靜態數據,我有原因是:

function fruitService(basketService) { 
    var data = [ 
    { 
    id: 0, 
    name: 'apple', 
    basket: function() { return basketService.getById(this.refs.basket); }, 
    refs: { 
     basket: 0 
    } 
    } 
    ]; 
} 

,你可以看到,我有函數basket返回一個籃子物品,這樣我就可以動態地從水果物體中檢索籃子物品。

籃下服務是相似的:

function basketService(fruitService) { 
    var data = [ 
    { 
    id: 0, 
    name: 'basket1', 
    fruits: function() { return fruitService.getByIdList(this.refs.fruits); }, 
    refs: { 
     fruits: [0, ...] 
    } 
    } 
    ]; 
} 

相同fruitService,我有一個fruits功能,可以給我水果的對象,當我問他們。我嘗試過不同的方法組合,試圖分解實際的靜態數據和服務來克服這種循環依賴,但是它沒有發生。

哪能建築師這個不具有這種循環依賴

回答

1

有服務使用$噴油器之一,並在運行時

var injectedService = $injector.get('servicenamehere'); 

進行查找的服務,您將需要$噴油器添加到你的服務參數爲這個工作(以防萬一有任何問題)

+0

謝謝我會試試 –

+1

我不喜歡這個答案。是的,它解決了角度誤差。但是循環依賴仍然存在。 –

+0

有時需要循環依賴關係。由於我們都不知道問題的全部範圍,我們都不能評論解決方案的適當性。 –

1

你不需要2服務。我認爲這足夠了。

function basketService() { 
    var data = [ 
    { 
    id: 0, 
    name: 'apple', 
    basketName: 'basket1' 
    }, 
    ]; 

    var service = { 
    getFruitById: getFruitById, 
    getBasketById: getBasketById 
    }; 

    function getFruitById(fruitId){ 
    // return one fruit here 
    } 

    function getBasketById(basketId){ 
    // return your basket with a list of fruits 
    } 
} 
+0

我想保持代碼模塊化和可維護性。我可能沒有提到這個問題,但這個應用程序會增長。隨着功能數量的增加,這個文件將變得非常大。如果我將來需要添加更多服務,該怎麼辦?這解決了這個問題,但對可維護性來說並不理想 –

+0

就可維護性而言,您在兩個服務中都有重複數據的事實比獨特的服務更糟糕。我會更新我的答案,保持2個服務和1個常量。 –

+0

你是什麼意思重複的數據? theres沒有重複的數據 –

0

另一種選擇是使用常量來存儲數據。

angular.module('yourApp').Constant("fruitAndBasketConstant", { 
    baskets : [{ 
     id : 0, 
     fruits : [ 
      { 
       // some info 
      }, 
      { 
       // some info 
      } 
     ] 
    }] 
}); 

並創建一個服務,將查詢您的常量。

angular.module("yourApp").factory("FruitService"["fruitAndBasketConstant", function(fruitAndBasketConstant){ 

    var service = { 
     getFruitById: getFruitById 
    }; 

    return service; 


    function getFruitById(fruitId){ 
     // loop through fruitAndBasketConstant.baskets 

     // and return the fruit you want 
    } 

}]); 

併爲您的basketService做同樣的事情。