2014-12-26 2 views
0

Я хотел бы поместить сообщение toastr для отображения сообщений $ log. Т.е .:

$log.info('test')); 

Похоже, что в AngularJS 1.2.19 и больше, $provide.decorator это отличный способ extend the functionality of $log. Конечно, я использую 1.2.18. Есть ли способ сделать это в 1.2.18?

В идеале я хотел бы расширить существующую функциональность, а не полностью ее переопределить.

Я не хочу изменять угловой источник.

+1

Вы также можете использовать декораторы с 1.2.18. Что не так? – PSL

+0

Я использовал ссылку https://code.angularjs.org/1.2.19/docs/api/auto/service/$provide, чтобы прочитать о $ provision. Когда я меняю селектор на 1.2.18, я получаю ошибку 404. Кажется, что это ошибка? Я еще раз исследовал сообщение об ошибке и обнаружил, что у меня другая проблема. Вы правы - это работает в 1.2.18. Благодаря! – Hoppe

+0

Причина для downvote? – Hoppe

ответ

2

Механизм декоратора является сокращением для создания поставщика, который получает предыдущее определение и возвращает новую версию.

Таким образом, вы можете имитировать эту функцию следующим образом:

module.provider('$log', function ($logProvider) { 
    // $logProvider here is the one previously defined, from 'ng' 
    // unless someone else is overriding too. 
    this.$get = function ($injector) { 
     // Invoke the original provider. 
     var $log = $injector.invoke($logProvider.$get); 
     var oldInfo = $log.info; 
     // Override the method. 
     $log.info = function info() { 
      oldInfo.apply(this, arguments); 
      // (not actually useful to alert arguments; just an example) 
      alert(arguments); 
     } 
     return $log; 
    } 
}); 

Конечно, это изменяет объект для всех иждивенцев, даже если бы они были вполне довольны стандартным $log интерфейсом, а также означает, что вы не имеете никакого прямого способ видеть в вашем приложении, какие службы зависят от стандартного интерфейса и которые зависят от вашего расширенного интерфейса. Это может быть полезно, если вы хотите просто изменить поведение существующих методов путем переноса (например, чтобы сделать журналы отправлены на ваш сервер или отобразить тостер, как вы упомянули в своем вопросе), но может быть рискованным выбором для добавления дополнительных методы, которые не ожидали существующие абоненты, где вы можете случайно нарушить совместимость со стандартным интерфейсом.

Вместо этого может быть лучше предоставить новую услугу, которую вы можете использовать в тех местах, где вы знаете, что вам требуется расширение, и оставить встроенный интерфейс $log в качестве стандарта. Таким образом, будет легче рассказать о различиях и избежать непреднамеренных изменений поведения в стандартных абонентах. Это выглядит аналогично предыдущему, но немного отличается в деталях:

module.provider('anotherLog', function ($logProvider) { 
    this.$get = function ($injector) { 
     var $log = $injector.invoke($logProvider.$get); 

     // Create a new object rather than extending the existing one in-place. 
     // This way the new method is only visible to callers that request 
     // 'anotherLog' instead of just '$log'. 
     var anotherLog = angular.extend(Object.create($log), { 
      sayHello: function sayHello() { 
       console.log('Hello!'); 
      } 
     }) 

     return anotherLog; 
    } 
}); 

Оба этот подход использует тот факт, что во время инициализации приложения отдельная «поставщик форсунка» используются для обработки зависимостей между поставщиками. Это отличается от основного $injector, который используется после создания приложения. Инжектор поставщика содержит всех поставщиков, которые были определены до сих пор, но не будет содержать результирующие службы, такие как $log. Сама функция поставщика вводится инжектором поставщика, тогда как ее метод $get (как показано в этих примерах) вводится с помощью основного $injector.

Из-за этого различия, если вы зависите от каких-либо других услуг для отображения тостера, необходимо зависеть от них только для метода $get, а не для провайдера в целом. Это позволит вам получить доступ к услугам в основном $injector, а не только поставщикам инжектора поставщика.

+0

Хорошая точка и объяснение декораторов – Hoppe

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