我怎样@observe没有在聚合物中实现observe.Observable的对象

时间:2014-09-16 12:26:42

标签: dart protocol-buffers dart-polymer

我使用protobuffers在我的前端和我的飞镖服务器之间进行通信 这些对象没有实现Observable

我的飞镖聚合物对象看起来像:

@CustomTag('user-address')
class UserAddress extends PolymerElement {

  @observable
  protobuffer.Address address = new protobuffer.Address();

我的html代码看起来像:

<template>
  <form method="post" on-submit="{{doSubmit}}">
    <input type="text" value="{{ address.street }}" name="street">
    Your street is {{ address.street }}.

由于protobuffer.Address没有实施Observable {{ address.street }},因此无法更新。

我找到了一些可能的解决方案/解决办法,但我对其中任何一个都不满意:

  • 分叉protobuffer创建代码[1]并将输出调整为mixin ChangeNotifier
    我已经实现了这一点,但我很确定我的更改不会被上游接受。

  • 将protobuffer对象转换为ObservableMap s。这不需要上游任何更改,但我们失去了类型安全性,必须从protobuffer→map转换,然后从map→protobuffer转换。

  • 尝试使用Mock个对象,并拦截setter调用。我没有花足够的时间来确定这是否可行。

[1]这些protobuffer对象由protobuf-builder自动生成,使用dart-protoc-plugin

2 个答案:

答案 0 :(得分:1)

我知道这可能不是您正在寻找的答案但是我真的建议您将数据传输对象类(通过线路发送的对象类)与视图对象类(支持数据绑定的类)分开)。

完成了很多MVVM模式开发后,我发现这总是一个好主意,值得它创建的重复。强制单个类既作为视图对象(数据绑定到它)又作为数据传输对象(使用例如protofuf传输)通常只会带来很多麻烦,特别是当您的应用程序增长时,视图变为更复杂,您想要在屏幕上显示的内容将不再按照您要传输的内容进行1:1的映射。

使用单个关注点来支持数据绑定的单独类将使您的绑定表达式更加简单。因为您可以在视图对象上自由创建属性而无需考虑数据传输,所以所有绑定表达式将始终为1:1属性,这使得数据绑定疑难解答变得更加简单。

答案 1 :(得分:0)

我不鼓励使用Mock对象。他们使用noSuchMethod使用反射/镜像,这可能会导致客户端代码大小出现问题。

唯一的替代解决方案是创建实现observable的包装类。