As expressões de polímero podem ser complicadas quando associadas às propriedades do modelo. Os documentos sobre Observables ainda não estão lá, e há muitas informações desatualizadas circulando nas interwebs.
Eu estava tentando alterar o texto em um botão com base no fato de o campo id de um modelo ser nulo ou não.
<button on-click="{{save}}" type="button">
<template if="{{exists}}">Edit</template>
<template if="{{!exists}}">Add</template>
</button>
Eu inicialmente tinha o seguinte:
@observable
bool exists => !(id==null);
O fato é que nenhum evento de alteração foi disparado quando as propriedades do modelo foram atualizadas. Acontece que a solução é vincular a uma variável fictícia e atualizá-la rastreando as alterações nas propriedades do modelo:
import 'package:polymer/polymer.dart';
import 'dart:mirrors';
import 'mymodel.dart';
@CustomTag(‘my-model-form’)
class MyModelForm extends PolymerElement {
@observable MyModel model = new MyModel();
@observable bool exists = false;
MyForm.created() : super.created();
@override
void attached() {
model.changes.listen(_trackChanges);
super.attached();
}
_trackChanges(changes) {
changes.forEach((PropertyChangeRecord record) {
if(MirrorSystem.getName(record.name)=='id')
exists = !(record.newValue==null);
});
}
}
Um PropertyChangeRecord retorna uma Lista de símbolos, então eu precisava da biblioteca Mirror para extrair o nome do campo real.