2014-01-27 89 views
0

我無法弄清楚如何捕捉由嵌套元素拋出的異常。飛鏢中嵌套聚合物元素捕捉異常

我想是這樣的:

<error-handler> 
    <hard-worker></hard-worker> 
</error-handler> 

的想法是,例如,使在硬工人一個REST請求。如果工作人員從REST服務器獲取錯誤,當然,它會自行處理錯誤。但最後它必須在某處/某處顯示錯誤消息。錯誤處理程序被認爲是向用戶顯示錯誤(例外)的人。錯誤處理程序應該是可以改變的。它可能是例如錯誤處理程序日誌消息或錯誤處理程序顯示彈出。

回答

0

我在GitHub上更新了我的Polymer-Sample。它顯示了兩種討論的方法:基於事件總線(已經存在)和新的DOM事件方法。 (一個我喜歡 - 更清潔)

工作示例(鉻)
https://rawgithub.com/MikeMitterer/DART-Sample-PolymerHelloWorld/master/build/index.html

代碼:
https://github.com/MikeMitterer/DART-Sample-PolymerHelloWorld/tree/master/web

我所做的一些細節:
的index.html

<!DOCTYPE html> 
<html> 
<head> 
    <link rel="import" href="hello-world/hello-world.html"> 
    <link rel="import" href="event-handler/event-handler.html"> 
    <link rel="import" href="stopwatch/stopwatch.html"> 
    <script type="application/dart">export 'package:polymer/init.dart';</script> 
</head> 
<body> 

    <h1>Hi first world!</h1> 
    <!-- event-handler should show some events coming in from hello-world --> 
    <event-handler> 
     <hello-world></hello-world> 
    </event-handler> 

    <script src="packages/browser/dart.js"></script> 
    </body> 
</html> 

HELLO-world.html
元,如果你點擊「觸發事件」 - 按鈕將觸發一個事件。這也可能是一個錯誤的消息...

<!DOCTYPE html> 
<polymer-element name="hello-world"> 
    <template> 
     <button on-click="{{increment}}">Click Me</button> 
     <button on-click="{{fireevent}}">Fire an event (received by event-handler)</button> 

     <p>Hello from inside a custom element! Clicks: {{count}}</p> 
    </template> 
    <script type="application/dart" src="hello-world.dart"></script> 
</polymer-element> 

HELLO-world.dart

import 'package:polymer/polymer.dart'; 
import 'package:event_bus/event_bus.dart'; 
import 'package:PolymerHelloWorld/globaleventbus.dart'; 
import 'dart:html'; 
import 'dart:math'; 
import 'package:json/json.dart' as JSON; 

@CustomTag('hello-world') 
class HelloWorldElement extends PolymerElement { 
    final EventBus _eventbus = new GlobalEventBus(); 

    @observable int count = 0; 

    HelloWorldElement.created() : super.created(); 

    void increment(Event e, var detail, Node target) { 
     count += 1; 
     _eventbus.fire(GlobalEventBus.basicClickEvent,"Test"); 
    } 

    void fireevent(Event e, var detail, Node target) { 
     final Random random = new Random(); 
     final Map json = { 'response' : 'Hi, this is a message', 'random' : random.nextInt(100)}; 

     // Fires a JSON-Message 
     fire("hello-event",detail: JSON.stringify(json)); 
    } 
} 

事件處理程序。HTML 模板接收 「你好事件」

<!DOCTYPE html> 
<polymer-element name="event-handler" on-hello-event="{{handleHelloEvent}}"> 
    <template> 
     <style> 
      .error { color: red; } 
     </style> 
     <p class="error">EventHandler (Shows hello-world events!) Message: {{response}}, Random number: {{randomnumber}}</p> 
     <content></content> 
    </template> 
    <script type="application/dart" src="event-handler.dart"></script> 
</polymer-element> 

事件handler.dart 實現handleHelloEvent在根據模板

import 'package:polymer/polymer.dart'; 
import 'package:json/json.dart' as JSON; 

@CustomTag('event-handler') 
class EventHandler extends PolymerElement { 

    @observable String response = ""; 
    @observable int randomnumber = 0; 

    EventHandler.created() : super.created(); 

    void handleHelloEvent(Event e, var detail, Node target) { 
     final Map json = JSON.parse(detail); 

     response = json['response']; 
     randomnumber = json['random']; 

     // Log to console 
     print("Received event! $detail"); 
    } 
} 

定義這就是它 - 如果你知道它如何工作 - 就像餡餅一樣簡單!

0

這將不起作用<hard-worker>中的代碼不會從<error-handler>中調用。

如果您提供了更多關於您想要在<error-handler>中處理的錯誤類型的信息,將會有所幫助。

如果您有易於出錯的代碼,您應該使用try-catch手來封裝錯誤,儘可能在本地處理錯誤。

編輯(評論)之後

更有意義。但是你真的想爲一個服務設置這樣的錯誤處理程序嗎?我寧願在頁面

我建議你使用類似的Eventbus(見答案爲例,這個問題How to access angular.dart component´s attribute or method)發送Error事件(像形式的文本輸入可視控件可能不同)這樣的錯誤處理程序並讓<error-handler>收聽此類事件。這些事件可以包含details屬性中的其他數據,如消息,嚴重性,...

+0

的恕我直言,這將是更好的,而不是擴展/改善你的問題發表評論的。我剛看到你已經下了決心。 另請參見我的擴展答案 –

+0

EventBus是/我的計劃B - 我只是認爲必須有一些內容支持聚合器,支持元素邊界的異常處理 - 似乎並非如此。順便說一下,我使用這個EventBus:http://pub.dartlang.org/packages/event_bus - 工程很好。 –

+0

我鏈接到的EventBus示例是此EventBus程序包的簡化版本(代碼具有對GitHub回購的引用)。 聚合物更多是構建獨立的元素/小部件而不是應用程序框架,因此缺少這樣的功能。 –

0

而不是

<polymer-element name="event-handler" on-hello-event="{{handleHelloEvent}}"> 

我認爲你可以使用(但沒有嘗試):

<event-handler> 
    <hello-world on-hello-event="{{handleHelloEvent}}"></hello-world> 
</event-handler> 

您的組件並不需要知道哪些方法被調用!

你也不必字符串化地圖:細節接受任何類型的對象

相關問題