通过jquery-file-upload上传EmberJS文件

时间:2013-07-17 12:24:03

标签: ember.js jquery-file-upload

我有一个Ember.js控制器,我正试图通过jquery文件上传将文件发送到我的rails控制器。

我从这开始:

myControllerAction: ->
  $('#fileupload').fileupload(
    url: "/api/v1/comics"
    dataType: 'json'
    formData:
      comic: {
        title: self.get('comicTitle')
        prompt_one_id: self.get('prompts')[0].get('id')
        prompt_two_id: self.get('prompts')[1].get('id')
      }
    )

哪个确实有效,但是一旦选择了文件就会发送表单。我希望在用户提交表单时完成所有操作。所以我尝试了这个:

  didInsertElement: ->
    $('#fileupload').fileupload(
      url: "/api/v1/comics"
      dataType: 'json'
      formData:
        comic: {
          title: self.get('comicTitle')
          prompt_one_id: self.get('prompts')[0].get('id')
          prompt_two_id: self.get('prompts')[1].get('id')
        }
      add: (e, data) ->
        data.submit()
      progressall: (e, data) ->
        progress = parseInt(data.loaded / data.total * 100, 10)
        $('#progress .bar').css('width', progress + '%')
    )

   myControllerAction: ->
    self = @
    $('#fileupload').fileupload('add')

然而,这不起作用。它抛出了一个javascript错误:

Uncaught Error: cannot call methods on fileupload prior to initialization; attempted to call method 'add' 

我认为在元素插入上设置所有内容都会初始化对象。所以我不确定我哪里出错了。有人有什么建议吗?

编辑:添加模板

    <form enctype="multipart/form-data">
      <div class="control-group">
        <label class="control-label" for="inputTitle">Title</label>
        <div class="controls">
          {{input type="text" valueBinding="comicTitle"}}
          {{input type="file" id="fileupload" valueBinding="comicFile"}}
        </div>
      </div>
      <button {{action myControllerAction}} id="upload_comic" class="btn btn-inverse">Upload Comic</button>
      <div id="progress">
        <div class="bar" style="width: 0%;"></div>
      </div>
    </form>

1 个答案:

答案 0 :(得分:0)

不确定错误的原因是什么,但尝试使用afterRender回调来执行此操作。也可以使用this.$('#fileupload')代替$('#fileupload')。代码:

  didInsertElement: ->
    Ember.run.scheduleOnce('afterRender', this, 'setupFileUpload')

  setupFileUpload: ->
    $('#fileupload').fileupload(
      url: "/api/v1/comics"
      dataType: 'json'
      formData:
        comic: {
          title: self.get('comicTitle')
          prompt_one_id: self.get('prompts')[0].get('id')
          prompt_two_id: self.get('prompts')[1].get('id')
        }
      add: (e, data) ->
        data.submit()
      progressall: (e, data) ->
        progress = parseInt(data.loaded / data.total * 100, 10)
        $('#progress .bar').css('width', progress + '%')
    )