Rispondere alla mia domanda dopo alcuni mesi di prova con metodi diversi. La mia soluzione è la seguente (con Rails).
Per qualsiasi modulo che richiede il caricamento di file, impostare data-remote="true"
e enctype="multipart/form-data"
e includere rails.js e jquery.iframe-transport.js.
L'impostazione data-remote="true"
con rails.js consente di eseguire il binding a ajax:success
e creare il modello Backbone.js in caso di successo.
HTML:
<form action="/posts.js" method="post" data-remote="true" enctype="multipart/form-data">
<input type="text" name="post[message]" />
<input type="file" name="post[file]" />
<button>Submit</button>
</form>
JavaScript:
Si dovrebbe ovviamente legarsi ajax:error
per gestire i casi di errore.
Per me, i dati vengono sterilizzate nel modello ActiveRecord
, quindi non c'è bisogno di preoccuparsi troppo per la dichiarazione eval
.
$('form').bind('ajax:success', function(event, data) {
new Model(eval(data)); // Your newly created Backbone.js model
});
Rails controller:
class PostsController < ApplicationController
respond_to :js
def create
@post = Post.create(params[:post])
respond_with @post
end
end
rotaie vista (create.js.haml):
Utilizzo della gemma remotipart.
Ciò gestire il caso in cui il modulo fa upload di file con enctype
stato impostato, e quando lo fa non è.
È possibile scegliere di chiamare sanitize
sulla risposta qui.
= remotipart_response do
- if remotipart_submitted?
= "eval(#{Yajl::Encoder.encode(@post)});"
- else
=raw "eval(#{Yajl::Encoder.encode(@post)});"
fonte
2012-02-11 22:55:10
Neat. Due domande però. Nel tuo controller, hai intenzione di fare 'Post.new (params [: post])' o in realtà intendevi 'Post.create (params [: post])'? E in secondo luogo, dove posizioneresti il callback '$ ('form'). Bind ('ajax: success')', in una classe Backbone.View per il modulo dato? Grazie! –
Grande cattura, errore di battitura da parte mia. Dovrebbe essere "Post.create". Inserirò $ ('form'). Bind ('ajax: success') nella mia vista Backbone che esegue il rendering del modulo. –
Aggiungi data-type = "json" al modulo ed è possibile rimuovere la vista. – maletor