当我的未来完成时,我如何通知观察到的变量?

时间:2014-09-10 17:37:20

标签: dart polymer dart-polymer

我的模板(item_view.html)引用了一个变量(Map项),它是一个getter,它实际上是在我的ViewModel中定义的。

在item_view.html中,例如:

<h1>{{item['subject']}}</h1>

在item_view.dart中,项目为:

  @observable Map get item => toObservable(viewModel.itemViewModel.item);

请注意,它引用了下面ItemViewModel中观察到的Map item

MainViewModel本身有一个到ItemViewModel的getter:

@observable ItemViewModel get itemViewModel {
    // Code to determine which item model to return.
    // ...
    return itemViewModels[id];
  }

最后,ItemViewModel本身获取该项目,并应使用结果填充item

class ItemViewModel extends Observable {
  final App app;
  @observable Map item = toObservable({});

  ItemViewModel(this.app) {
    getItem();
  }

  void getItem() {
    ...
    // TODO: This completes later, and item changes aren't being observed!
    f.child('/items/' + decodedItem).onValue.first.then((e) {
       item['subject'] = // ...and so on.
    ...

问题似乎是因为侦听器将来完成,它不会更新@observable Map item而不会在模板中反映出来。

我在某个地方错过了toObservable()吗?我是否需要使用notifyChange()(我不知道何时使用它并且找不到好的例子)?

2 个答案:

答案 0 :(得分:2)

您必须绑定到itemViewModel属性,并在更改时通知对item属性的更改。将此代码放在元素的构造函数中:

onPropertyChange(itemViewModel, #item, 
    () => _old = notifyPropertyChange(#item, _old, itemViewModel.item));

并添加var _old = null;作为您的课程的属性(无需使其成为@observable或其他任何内容)。

要收听路径,而不是简单的属性:

new PathObserver(this, [#viewModel, #itemViewModel, #item])
      .open((newValue, oldValue) => notifyPropertyChange(#item, oldValue, newValue));

在这里,当你在{{item属性itemViewModel属性值的viewModel属性的值this属性时1}}对象更改,通知我的item属性的观察值,该值已从oldValue更改为newValue&#34;。 (请注意,newValueoldValue在回调和notifyPropertyChange的调用中被反转。)

答案 1 :(得分:2)

这条线没有多大意义

@observable Map get item => toObservable(viewModel.itemViewModel.item);

物品已经可以观察到,因为你用这条线可以观察到它

@observable Map item = toObservable({}); 

当您将另一个地图分配给item时,您必须确保在分配它之前使其可观察或使item成为最终版本,然后当您尝试重新分配其他内容时会出现异常。然后,您只能添加/删除项目,但可以确保item保留可观察的地图。

@observable final Map item = toObservable({}); 

更新

@ComputedProperty('viewModel.itemViewModel.item')
@observable Map get item => toObservable(viewModel.itemViewModel.item);

http://www.dartdocs.org/documentation/polymer/0.12.0/index.html#polymer/polymer.ComputedProperty#id_ComputedProperty-