我的模板(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()
(我不知道何时使用它并且找不到好的例子)?
答案 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;。 (请注意,newValue
和oldValue
在回调和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);