我使用protobuffers在我的前端和我的dart服务器之间进行通信. 这些对象不实现Observable. 我的dart-polymer对象看起来像: @CustomTag('user-address')class UserAddress extends PolymerElement { @observable protobuf
这些对象不实现Observable.
我的dart-polymer对象看起来像:
@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}}将不会更新.
我找到了一些可能的解决方案/解决方案,但我对其中任何一个都不满意:
> fork protobuffer创建代码[1]并使输出适应mixin ChangeNotifier.
我已经实现了这个,但我很确定我的更改不会被上游接受.
>将protobuffer对象转换为ObservableMaps.这不需要上游任何更改,但我们失去了类型安全性,必须从protobuffer→map转换,然后从map→protobuffer转换.
>尝试使用Mock对象,并拦截setter调用.我没有花足够的时间来确定这是否可行.
[1]这些protobuffer对象由protobuf-builder自动生成,使用dart-protoc-plugin.
我知道这可能不是您正在寻找的答案,但我真的建议您将数据传输对象类(通过线路发送的对象类)与视图对象类(支持数据绑定的类)分开.完成了很多MVVM模式开发后,我发现这总是一个好主意,值得它创建的重复.强制单个类既作为视图对象(数据绑定到它)又作为数据传输对象(使用例如protofuf传输)通常只会带来很多麻烦,特别是当您的应用程序增长时,视图变为更复杂,您想要在屏幕上显示的内容将不再按照您要传输的内容进行1:1的映射.
使用单个关注点来支持数据绑定的单独类将使您的绑定表达式更加简单.因为您可以在视图对象上自由创建属性而无需考虑数据传输,所以所有绑定表达式将始终为1:1属性,这使得故障排除数据绑定更加简单.