ho creato la seguente tecnica sul mio sito
class FooView extends MyView
tag: "div"
modelBindings:
"change form input.address" : "address"
"change form input.name" : "name"
"change form input.email" : "email"
render: ->
$(@el).html """
<form>
<input class="address"/>
<input class="name"/>
<input class="email"/>
</form>
"""
super
@
# Instantiate the view
view = new FooView
model: new Backbone.Model
$("body").html(view.el)
ho dettagliata L'estensioni al backbone è necessario fare sul mio blog
http://xtargets.com/2011/06/11/binding-model-attributes-to-form-elements-with-backbone-js/
utilizza lo stesso stile dichiarativo come la proprietà eventi per gli elementi del modulo vincolante per il modello attributi
e qui è il codice vero e implementando la classe per voi in CoffeeScript
class MyView extends Backbone.View
render: ->
if @model != null
# Iterate through all bindings
for selector, field of @modelBindings
do (selector, field) =>
console.log "binding #{selector} to #{field}"
# When the model changes update the form
# elements
@model.bind "change:#{field}", (model, val)=>
console.log "model[#{field}] => #{selector}"
@$(selector).val(val)
# When the form changes update the model
[event, selector...] = selector.split(" ")
selector = selector.join(" ")
@$(selector).bind event, (ev)=>
console.log "form[#{selector}] => #{field}"
data = {}
data[field] = @$(ev.target).val()
@model.set data
# Set the initial value of the form
# elements
@$(selector).val(@model.get(field))
super
@
scusato se non ti piace CoffeeScript. Lo voglio. Tutti sono diversi :)
Ho finito per fare esattamente questo. Io lavoro molto bene finora. Come hai detto, salva ogni modifica sull'input. Gli errori vengono visualizzati immediatamente, il che è positivo e negativo (i campi non modificati visualizzano errori come non possono essere vuoti durante la creazione di un record). – Julien
1. si può anche provare l'evento sfocatura. 2. Ho riflettuto su questo problema, sarebbe utile avere un array "binding" simile all'hash "events" che specifica gli aggiornamenti tra le parti view e gli attributi del modello con parametri di tipo sync (at_change, at_blur etc) . diciamo simile a 'binding: [[" div # title "," model.title "," change "," <- "], [" input # description "," model.description "," change "," <-> " ]] 'o qualcosa del genere, dovrebbe essere abbastanza facile da implementare. – clyfe
Penso che tu possa usare Handlebar.js come motore di template. Ha questo tipo di legami. – Julien