我无法弄清楚如何捕获嵌套Element抛出的异常。
我想要的是:
<error-handler>
<hard-worker></hard-worker>
</error-handler>
例如,这个想法是在勤奋工作者中制作REST-Request。如果hard-worker从REST-Server收到错误,当然,它会自行处理错误。但最后它必须在某处/某种程度上显示错误消息。错误处理程序被认为是向用户显示错误(异常)的人。错误处理程序应该是可更改的。它可以是例如error-handler-log-message或error-handler-show-popup。
答案 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