从Dart中的嵌套聚合物元素捕获异常

时间:2014-01-27 08:14:20

标签: dart dart-polymer polymer

我无法弄清楚如何捕获嵌套Element抛出的异常。

我想要的是:

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

例如,这个想法是在勤奋工作者中制作REST-Request。如果hard-worker从REST-Server收到错误,当然,它会自行处理错误。但最后它必须在某处/某种程度上显示错误消息。错误处理程序被认为是向用户显示错误(异常)的人。错误处理程序应该是可更改的。它可以是例如error-handler-log-message或error-handler-show-popup。

3 个答案:

答案 0 :(得分:0)

这不起作用,因为<hard-worker>中的代码未从<error-handler>调用。

如果您提供了有关您希望在<error-handler>中处理哪种错误的详细信息,将会很有帮助。

如果您的代码容易出错,那么应该使用try-catch手工封装错误,尽可能在本地处理错误。

编辑(评论后)

这更有意义。但是你真的想要为一个服务设置这样的错误处理程序吗?我宁愿为页面设置这样的错误处理程序(对于像表单文本输入这样的可见控件可能不同)

我建议您使用Eventbus之类的内容(请参阅此问题的答案示例How to access angular.dart component´s attribute or method)来发送Error个事件并让<error-handler>听取此类事件事件。事件可以包含details属性中的其他数据,如消息,严重性,......

答案 1 :(得分:0)

我在GitHub上更新了我的Polymer-Sample。 它显示了两种讨论的方法:基于Eventbus(已经存在)和新的DOM-Event方法。 (我更喜欢的那个 - 更清洁)

工作样本(Chrome)
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>

<强>你好-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>

<强>你好-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));
    }
}

<强>事件handler.html 收到“hello-event”的模板

<!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");
    }
}

就是这样 - 如果你知道它是如何工作的 - 就像馅饼一样简单!

答案 2 :(得分:0)

而不是

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

我认为你可以使用(但没试过):

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

您的组件无需知道必须调用哪种方法!

此外,您不需要对地图进行字符串化:detail接受任何类型的Object