2012-12-07 18 views
5

Ho una vista contentEditable che quando focusOut ottengo l'html inserito e lo salvo.contenteditable ed emberjs

Ma quando rimuovo tutto il testo dalla contenteditable e quindi concentrarsi fuori ottengo l'errore

Uncaught Error: Cannot perform operations on a Metamorph that is not in the DOM. 

consulta questo jsfiddle ed eliminare il testo valore1 e concentrarsi fuori.

http://jsfiddle.net/rmossuk/Q2kAe/8/

Qualcuno può aiutare con questo?

migliori saluti Rick

+0

suona per me come può essere un bug. Potresti provare a segnalarlo su github https://github.com/emberjs/ember.js/issues soprattutto perché hai un violino che può riprodurlo. – Aras

risposta

4

vostri EditableView stabilisce un legame di visualizzazione al suo content.value:

<script type="text/x-handlebars" data-template-name="editable"> 
    {{view.content.value}} 
</script> 

Ember svolge la sua magia vincolante-aggiornamento avvolgendo le parti pertinenti con tag script pennarello. Dai un'occhiata al DOM risultante:

Ember display binding script tags

Ora fate la vostra visualizzazione modificabile. Non appena l'utente cancella completamente il contenuto della vista, noterai che anche i tag di script circostanti vengono rimossi (dal browser). Al momento Ember tenta di aggiornare il display, non troverà i tag script necessari e quindi si lamenta.

Non credo che questo approccio possa funzionare in modo affidabile con contenteditable, poiché non sarà possibile controllare il browser lasciando intatto l'ambiente Ember. Credo che si avrà bisogno di prendersi cura della vista di aggiornare da soli: rimuovere l'associazione, creare un osservatore content.value e aggiornare il DOM esplicitamente:

App.EditableView = Em.View.extend({ 
    contenteditable: "true", 
    attributeBindings: ["contenteditable"], 

    _observeContent: (function() { 
     this._displayContent(); 
    }).observes('content.value'), 

    didInsertElement: function() { 
     this._displayContent(); 
    }, 
    _displayContent: function() { 
     this.$().html(this.get('content.value')); 
    }, 
    ... 

Ecco un JSFiddle con una demo di questa soluzione: http://jsfiddle.net/green/BEtzb/2/.

(Si potrebbe naturalmente anche utilizzare un Ember.TextField che utilizza un campo di inserimento regolare e fornisce tutta la magia di legame, se questo è tutto ciò che serve.)

+0

grazie a Julian D. Lo stavo già facendo prima, ma stavo cercando di vedere se potevo usare ember per tenermi aggiornato invece di aggiornare il contenuto da solo. Tornerò alla tua soluzione! –