javascript - 使用 Backbone 上传文件

标签 javascript ruby-on-rails backbone.js

我在 Rails 应用程序中使用 Backbone.js,我需要将文件上传作为其中一个 Backbone 模型的一部分。

我不相信 Backbone 允许开箱即用的多部分文件上传。有没有人设法通过一些插件或另一个外部库让它工作?我如何扩展 Backbone.js 来支持它?

最佳答案

在使用不同方法试用几个月后回答我自己的问题。我的解决方案如下(使用 Rails)。

对于任何需要文件上传的表单,我会设置 data-remote="true"enctype="multipart/form-data" 并包含 rails.jsjquery.iframe-transport.js .

使用 rails.js 设置 data-remote="true"允许我绑定(bind)到 ajax:success 并在成功时创建 Backbone.js 模型。

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:

您显然应该绑定(bind) ajax:error 来处理错误情况。

对我来说,数据在 ActiveRecord 模型中进行了清理,所以不必太担心 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

Rails View (create.js.haml):

使用 remotipart gem 。

这将处理表单上传文件并设置了 enctype 和未设置的情况。

您可以选择在此处对您的响应调用sanitize

= remotipart_response do
  - if remotipart_submitted?
    = "eval(#{Yajl::Encoder.encode(@post)});"
  - else
    =raw "eval(#{Yajl::Encoder.encode(@post)});"

关于javascript - 使用 Backbone 上传文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6500379/

相关文章:

javascript - => 在 Node js 中是什么意思

ruby-on-rails - 如何建立一个失败的测试?测试通过但 Rails 服务器显示 : ‘uninitialized constant’

javascript - 如何从 jquery datePicker 获取选定的日期

ruby-on-rails - 从 ActiveRecord 实例中访问 RoR ActiveRecord 的属性

backbone.js - Marionette AppRouter+Controller 相对于 Backbone.Router 的优势是什么?

javascript - Backbone .js : Not rendering some view

javascript - 在 Link react-router 中传递 Prop

javascript - 滚动到消息末尾

javascript - 强制 localeCompare 区分大小写

javascript - 如何在 Rails 中通过 JS 动态添加新的嵌套字段以形成表单?