2013-10-03 10 views
5

ho questo codice html:on-cambiamento evento non sparare correttamente quando vincolante valore

<textarea id="text-to-convert" on-change="change" value="{{text}}"></textarea> 

E questo codice dardo:

import "dart:html"; 
import 'package:polymer/polymer.dart'; 

@CustomTag('dictionary-converter') 
class DictionaryConverter extends PolymerElement with ObservableMixin { 

    @observable String text = "Initial text"; 

    void change(Event event, var detail, TextAreaElement textElement) { 
    print(textElement.value); 
    print(text); 
    } 

} 

In questo caso, l'evento on-change viene attivato solo di volta in volta. (Non ho ancora capito esattamente quando).

Quando rimuovo il binding value={{text}}, l'evento viene attivato correttamente ogni volta che viene modificato il testo.

Sto trascurando qualcosa o si tratta di un bug?

risposta

7

Con Polymer 0.8 e superiori è possibile utilizzare * ** yourFieldName cambiato. Quando la proprietà osservata cambia, verrà chiamato il metodo Changed. Poiché String text è associato a dati bidirezionali, la modifica del valore dell'area di testo modifica il valore di String text e chiama il metodo textChanged. Questo funziona con il vostro codice originale e non ha bisogno ObservableBox

import "dart:html"; 
import 'package:polymer/polymer.dart'; 

@CustomTag('dictionary-converter') 
class DictionaryConverter extends PolymerElement with ObservableMixin { 

    @observable String text = "Initial text"; 

    textChanged(oldValue) { 
    print("textarea: ${this.shadowRoot.query("textarea").value}"); 
    print("text: ${text}"); 
    } 
} 
0

A quanto pare devo usare un ObservableBox come descritto in this stackoverflow question

Così ho finito con:

import "package:polymer/polymer.dart"; 
import "package:observe/observe.dart"; 

@CustomTag('dictionary-converter') 
class DictionaryConverter extends PolymerElement with ObservableMixin { 

    ObservableBox csvText = new ObservableBox("Initial text"); 

    ready() { 
    csvText.changes.listen(convert); 
    } 

    void convert(x) { 
    String text = csvText.value; 
    } 

}