2015-05-02 69 views
3

我想知道是否有辦法使提供程序的配置在整個應用程序中都是唯一的,但僅限於配置它的模塊。Angularjs提供程序在不同模塊中具有不同的配置

例如,我有一個模塊「核心」,其中包含提供者的定義。然後我有模塊「module1」和「module2」,它們使用提供程序,但必須以特定方式爲特定模塊進行配置。

發生在我身上的事情是,在最後定義的模塊中完成的配置將覆蓋在應用程序中使用提供程序的所有其他模塊中完成的配置。

我做了這個簡單的plunker舉例說明本:

var app = angular.module('app', ['module1','module2']); 

angular.module('core',[]) 

.provider('movie', function() { 
    var version; 
    return { 
    setVersion: function (value) { 
     version = value; 
    }, 
    $get: function() { 
     return { 
      title: 'The Matrix' + ' ' + version 
     } 
    } 
    } 
}); 

angular.module('module1',['core']) 

.config(function (movieProvider) { 
    movieProvider.setVersion('Reloaded'); 
}) 

.controller('ctrl1', function ($scope,movie) { 
    $scope.title = movie.title; 
    $scope.module = 'module1'; 
}); 


angular.module('module2',['core']) 

.config(function (movieProvider) { 
    movieProvider.setVersion('Revolutions'); 
}) 

.controller('ctrl2', function ($scope,movie) { 
    $scope.title = movie.title; 
    $scope.module = 'module2'; 
}); 

http://plnkr.co/edit/BI5nhmcdgzQZfZo56Koh?p=preview

回答

4

理論和其他沒用的廢物

在角提供商,$ get是打算返回所提供的單個實例功能; $ get()在提供者的每個實例上重新執行(如工廠)。提供提供者定義的函數或對象只能實例化一次(如服務)。因此,要從您的提供商那裏獲得類似工廠的屬性,您希望將實例特定的屬性保留在$ get的範圍內;並獲得$ get以外的服務類屬性。

這看起來似乎有點限制或迂迴開始,但它允許您以非常漂亮的方式組合實例範圍和全局範圍的屬性。

你的問題,特別是

您的問題具體地講,如果我們只是移動var version$get,我們突然得到你要找的工廠類似的行爲:

.provider('movie', function() { 
    return { 
    $get: function() { 
     var version; 

     var obj = { 
      title: function() { return 'The Matrix' + ' ' + version; }, 
      setVersion: function (value) { 
      version = value; 
      } 
     }; 

     return obj; 
    } 
    } 
}); 

http://plnkr.co/edit/0m9qKzNuhCOOXTbrCQ1T?p=preview

更改範圍(連同將標題更改爲變量的函數,而不是在創建obj時靜態生成的字符串),獲得期望的輸出:

This is module module1 

Title: The Matrix Reloaded 

This is module module2 

Title: The Matrix Revolutions 

這基本上就像工廠的ATM。

如果供應商實際上脫穎而出

進入一個供應商的更正常使用情況下(在這裏我們要結合全球和每個實例的作用域),假設我們希望有一個使用5月的API提供商在不同人的應用程序中使用幾種不同的API之一 - 但每個應用程序只能使用一個API。我們很希望我們的供應商看起來大致是這樣的 -

.provider('movie', function() { 
    var imdbEndpoint; 

    return { 
    setApiEndpoint: function(newImdbEndpoint) { 
     imdbEndpoint = newImdbEndpoint; 
    }, 
    $get: function() { 
     var version; 

     var obj = { 
      title: function() { return imdbEndpoint + ' says the The Matrix version is ' + ' ' + version; }, 
      setVersion: function (value) { 
      version = value; 
      } 
     }; 

     return obj; 
    } 
    } 
}); 

http://plnkr.co/edit/ZoSgQDpNdX8MOmet7xzM?p=preview

輸出: 這是模塊模塊1

Title: api.imdb.com says the The Matrix version is Reloaded 

This is module module2 

Title: api.imdb.com says the The Matrix version is Revolutions 

所以,現在我們的API端點URL是全球範圍的(或者以每個應用程序爲基礎),但是我們可以參考我們想要的任何一部電影,而不會對Neo中矩陣的哪一層感到困惑 - 因爲這就是實際情況,對吧?

相關問題