Hey!
I am afraid that the problem is not about the directive requiring the
factory that also creates that directive. That is something we do at
ui-bootstrap (check modal.js for example). It is a common pattern to
generate directives from a service and that directive using the service to
close itself.
The problem is the decorated $exceptionHandler which is really picky with
what you inject. Creating an exceptionHandler instead of decorating the
existing one and then injecting toastr by hand solves the problem.
Anyway I really appreciate your answer :)
On Thursday, February 13, 2014 9:03:22 PM UTC+1, Martin Alix wrote:
>
> That's very hard to solve...
>
> Maybe an approach that starts like this:
>
> angular.module('toastr', [])
> .config(function($provide) {
> $provide.decorator("$exceptionHandler", function($delegate,
> toastr) {
> return function(exception, cause) {
> toastr.error(exception.message, 'ERROR!');
> };
> });
> })
> .directive('toasts', function($compile, toastr) {
> return {link:function(scope, element, attrs) {
> scope.$watch(toastr.lastToast, function(a,b,s) {
> if(a === null) return;
> element.append($compile('<pre>' + a + '</pre>')(scope))
> //replace this...
> })
> }};
> })
> .factory('toastr', function() {
> var toastrs = [];
> var index = -1;
> return {
> lastToast: function() {
> if(index === -1) return null;
> return toastrs[index].message;
> },
> error: function(message, title) {
> var newToastr = {
> index: index++,
> message: message,
> title: title
> };
>
> toastrs.push(newToastr);
> }
> };
> })
>
>
> http://plnkr.co/edit/KK1dT3xKDkdqjvTmiaeq?p=preview
>
>
> On Wednesday, February 12, 2014 6:57:06 PM UTC-5, Jesus Rodriguez wrote:
>>
>> I am fighting a fight I cannot understand properly so I come here to get
>> some knowledge.
>>
>> I am porting a jQuery directive to angular. It is to popup alerts. I
>> decided to go to the ui-bootstrap $modal route, AKA a directive and a
>> factory that will create new directives to append them to the body. So far
>> so good, it works perfect for me.
>>
>> Even when it is really WIP I decided to swap the jQuery version for my
>> version and I got a:
>>
>> Uncaught Error: [$injector:cdep] Circular dependency found: $interpolate
>> <- $compile <- toastr <- $exceptionHandler <- $rootScope <- $route
>>
>> For what I understand, $exceptionHandler is really picky about what you
>> inject and normally it suggest you to manual inject with $injector.
>>
>> My provider is something like:
>>
>> $get: ['$compile', '$document', '$rootScope', function($compile, $document,
>> $rootScope) {
>>
>>
>> Both $compile and $rootScope are the problematic here.
>>
>>
>> My question are:
>>
>>
>> Why is $exceptionHandler so picky? I tried to reproduce my problem creating
>> a controller using $rootScope and injecting also my provider and it works
>> good. It only seems to fail with $exceptionHandler.
>>
>>
>> Should I change my $get? Since it compiles new alerts, I need $compile and
>> also $rootScope (to give them a scope)
>>
>>
>> I tried manually getting my library on the exceptionHandler and nothing, it
>> still fail and since it is a alert messages, it is normally used as logger
>> and logging and $exceptionHandler are friends.
>>
>>
>> Ideas? Thoughts?
>>
>>
--
You received this message because you are subscribed to the Google Groups
"AngularJS" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/angular.
For more options, visit https://groups.google.com/groups/opt_out.