2015-05-02 3 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.

Вначале это может показаться немного ограниченным или круговым, но это позволяет сочетать объекты с областью действия с округлением и глобальными областями по-настоящему изящно.

Ваша проблема, в частности,

Для вашей проблемы конкретно, если мы просто двигаться 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 

Это в основном как фабричный банкомат.

Где провайдеры на самом деле выделяются

Чтобы попасть в более нормальный случай использования провайдера (где мы хотим объединить глобальными и за экземпляр обзорным), скажем, мы хотели бы иметь поставщик 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)

Выход: Это модуль module1

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 находится, потому что это то, о чем это действительно так, не так ли?

Смежные вопросы