2013-02-19 35 views
18

Bây giờ nhiệm vụ của tôi là viết lại nhà cung cấp $ exceptionHandler để nó sẽ xuất ra hộp thoại phương thức với thông báo và dừng sự kiện mặc định.AngularJs/.provider/cách lấy rootScope để phát sóng?

Những gì tôi làm:

trong init Dự án tôi sử dụng phương pháp .provider:

.provider('$exceptionHandler', function(){ 

//and here I would like to have rootScope to make event broadcast 

}) 

standart phương pháp bơm không hoạt động.

UPD: sandbox - http://jsfiddle.net/STEVER/PYpdM/

Trả lời

31

Bạn có thể tiêm kim phun và tra cứu $ rootScope.

Demo plunkr: http://plnkr.co/edit/0hpTkXx5WkvKN3Wn5EmY?p=preview

myApp.factory('$exceptionHandler',function($injector){ 
    return function(exception, cause){ 
     var rScope = $injector.get('$rootScope'); 
     if(rScope){ 
      rScope.$broadcast('exception',exception, cause); 
     } 
    }; 
}) 

Cập nhật: thêm .provider kỹ thuật quá:

app.provider('$exceptionHandler', function() { 
    // In the provider function, you cannot inject any 
    // service or factory. This can only be done at the 
    // "$get" method. 

    this.$get = function($injector) { 
    return function(exception,cause){ 
     var rScope = $injector.get('$rootScope'); 
     rScope.$broadcast('exception',exception, cause); 
    } 
    }; 
}); 
+0

Trong khi điều này giải quyết được vấn đề, nếu bạn cần '$ rootScope' được tiêm vào một cấu hình nhà cung cấp (chẳng hạn như ví dụ .provider tại đây: https://gist.github.com/Mithrandir0x/3639232) thì phương thức này sẽ không hoạt động. – Webnet

+0

Dường như nó hoạt động tốt. Đây là một plunkr với nó: http://plnkr.co/edit/svRUruKSzuLcBPAWa0ro?p=preview – checketts

+0

Tôi đoán chúng tôi không thể vào thời điểm đó nhưng bây giờ, bạn chỉ có thể làm điều này. $ Get = function ($ rootScope) 'afaik – Ellone

-2

Bạn cần phải tiêm $ rootScope:

.provider('$exceptionHandler', '$rootScope', function(){ 

//and here I would like to have rootScope to make event broadcast 

}) 

Đây có phải là những gì bạn đã cố gắng? Và nếu như vậy bạn có một thông báo lỗi hoặc một jsfillde/plnkr để xem lý do tại sao nó không thành công?

+0

như tôi đã nói tiêu chuẩn cách không hoạt động. –

+0

Có, nhưng nếu nó không hoạt động, bạn hoặc là sử dụng nó sai gây ra nó không có hiệu lực có thể nhìn thấy hoặc nó sẽ tạo ra một lỗi. Nếu bạn thực hiện một jsfiddle nó sẽ dễ dàng hơn nhiều cho chúng tôi để giúp bạn. – martijnve

+0

jsfiddle đã được thêm –

1

cách tôi làm điều này - sử dụng một trang trí và quay trở lại xử lý ngoại lệ trước đây về chưa biết lỗi:

app.config(function ($provide) { 
    $provide.decorator('$exceptionHandler', function($delegate, $injector) { 
    return function (exception, cause) { 
     if (ICanHandleThisError) { 
     var rootScope= $injector.get('$rootScope'); 
     // do something (can use rootScope) 
     } else 
     $delegate(exception, cause); 
    }; 
    }); 
}); 
Các vấn đề liên quan