2014-10-11 68 views
1

所以我有一些模型,我打算在服务器上使用,以及客户端共享库:PolymerDart:数据绑定模板和复杂的模型

library models; 

class Model { 
    String id; 
} 

class Theatre extends Model { 
    String name; 
    // implements List<E> 
    CustomCollection<Movie> movies = new CustomCollection(); 

    Theatre(this.name); 
} 

class Movie extends Model { 
    String name; 
    Movie(this.name); 
} 

我有这样的聚合物元件:

<polymer-element name="my-app"> 
    <template> 
    <movie-list movies="{{theatre.movies}}"></movie-list> 
    <button on-click="{{moreMovies}}">More movies!</button> 
    </template> 
    <script type="application/dart" src="my_app.dart"></script> 
</polymer-element> 

用下面的代码背后:

import 'package:polymer/polymer.dart'; 
import 'package:my_app/models.dart'; 

@CustomTag('my-app') 
class MyApp extends PolymerElement { 
    @observable theatre = new Theatre('Lucky Seven Cinema'); 

    void moreMovies(event, detail, sender) { 
    theatre.movies.add(new Movie('The Goonies')); 
    } 
} 

PolymerDart似乎没有观察到我的属性更改:初始页面加载后,更改theatre.name或从theatre.movi​​es添加或删除项目不会导致绑定更新。 Polymer的文档说expressions are re-evaluated when the value of one or more paths in an expression changes

如果我进入models库并添加@observable我所有的模型属性,PolymerDart似乎拿起变化,但现在我已经添加了一个新的依赖我的模型库 - 我想这个库工作无论是在客户端还是服务器上,所以我不必重复自己的逻辑。

此外,将@observable添加到每个可能的属性,我可能想要数据绑定是超级矫枉过正和相当凌乱的看看。

我假设我在这里做错了什么:它是什么?

回答

1

模型类需要扩展Observable,属性需要@observable注释。有关更多详细信息,请参阅Observe package from polymer dart

class model extends Observable { 
    ... 
} 

class Theatre extends Model { 
    @observable 
    String name; 
} 

我不能告诉你CustomCollection实施的样子,但如果它包含一个嵌入列表或地图中你应该初始化它像List backingList = toObservable([]);所以聚合物得到通知时添加的元素/删除。

+0

如果我扩展了Observable并将@observable注释添加到支持列表中,那么'CustomCollection'不会发出更改事件。支持清单当然是。我查看了PolymerDart的源代码,显然它们处理ObservableList的方式不同;你不能代理一个ObservableList的事件,因为他们不会被监听。 – ALW 2014-10-11 21:53:33

+0

经过多次调查后,我确定没有其他办法可以用@observable来感染共享库。 – ALW 2014-10-14 01:57:47