【问题标题】:Catch exception from nested polymer element in Dart从 Dart 中的嵌套聚合物元素中捕获异常
【发布时间】:2014-02-17 23:50:59
【问题描述】:

我不知道如何捕获嵌套元素引发的异常。

我想要的是这样的:

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

这个想法是,例如,在 hard-worker 中发出 REST-Request。如果 hard-worker 从 REST-Server 收到错误,它当然会进行自己的错误处理。但最后它必须在某处/以某种方式显示错误消息。错误处理程序被认为是向用户显示错误(异常)的人。错误处理程序应该是可变的。例如,它可能是 error-handler-log-message 或 error-handler-show-popup。

【问题讨论】:

    标签: dart dart-polymer polymer


    【解决方案1】:

    这不起作用,因为&lt;hard-worker&gt; 中的代码不是从&lt;error-handler&gt; 调用的。

    如果您在&lt;error-handler&gt; 中提供有关您要处理的错误类型的更多信息,将会很有帮助。

    如果你有容易出错的代码,你应该用 try-catch 手封装它,尽可能在本地处理错误。

    编辑(评论后)

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

    我建议您使用类似Eventbus 的东西(请参阅此问题How to access angular.dart component´s attribute or method 的答案示例)发送Error 事件并让&lt;error-handler&gt; 监听此类事件。事件可以在 details 属性中包含其他数据,例如消息、严重性......

    【讨论】:

    • 恕我直言,最好扩展/改进您的问题而不是评论。我刚刚看到你已经被否决了。另请参阅我的扩展答案
    • EventBus 是/是我的 B 计划——我只是认为聚合物中必须有一些东西支持元素边界上的异常处理——似乎不是这样。顺便说一句,我正在使用这个 EventBus:pub.dartlang.org/packages/event_bus - 效果很好。
    • 我链接的 EventBus 示例是这个 EventBus 包的简化版本(代码参考了 GitHub 存储库)。 Polymer 更多的是构建独立元素/小部件而不是应用程序框架,因此缺少此类功能。
    • 我知道它不是一个应用程序框架,但最终一些聚合物元素必须协同工作。 EventBus 方法中我不喜欢的是 EventBus 和 Element 之间的紧密耦合。采用聚合物中的小部件库 - 它应该是通用的,但如果没有错误处理方法,它怎么能有用?
    • 您可以公开一个元素属性,该属性引用其错误的可观察列表以及绑定到该属性的错误处理元素。
    【解决方案2】:

    我在 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>
    

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

    event-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>
    

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

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

    【讨论】:

      【解决方案3】:

      代替

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

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

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

      您的组件不需要知道必须调用哪个方法!

      您也不需要对地图进行字符串化:detail 接受任何类型的对象

      【讨论】:

        猜你喜欢
        • 2014-05-18
        • 1970-01-01
        • 2014-12-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多