This commit is contained in:
Leo Horie 2015-04-13 22:17:00 -04:00
parent f3f5b10f1b
commit 4d03595bb1
2 changed files with 26 additions and 11 deletions

View file

@ -450,7 +450,7 @@ var Uploader = {
var formData = new FormData var formData = new FormData
for (var key in options.data) { for (var key in options.data) {
for (var i = 0; i < options.data[key].length; i++) { for (var i = 0; i < options.data[key].length; i++) {
formData.append(key, files[i]) formData.append(key, options.data[key][i])
} }
} }
@ -461,7 +461,7 @@ var Uploader = {
return m.request(options) return m.request(options)
}, },
serialize: function(files) { serialize: function(files) {
var promises = Array.prototype.slice.call(files).map(function(file) { var promises = files.map(function(file) {
var deferred = m.deferred() var deferred = m.deferred()
var reader = new FileReader var reader = new FileReader
@ -470,7 +470,7 @@ var Uploader = {
deferred.resolve(e.result) deferred.resolve(e.result)
} }
reader.onerror = deferred.reject reader.onerror = deferred.reject
return deferred return deferred.promise
}) })
return m.sync(promises) return m.sync(promises)
}, },
@ -481,7 +481,7 @@ var Uploader = {
this.update = function(e) { this.update = function(e) {
e.preventDefault() e.preventDefault()
if (typeof args.onchange == "function") { if (typeof args.onchange == "function") {
args.onchange((e.dataTransfer || e.target).files) args.onchange([].slice.call((e.dataTransfer || e.target).files))
} }
} }
}, },
@ -497,9 +497,11 @@ Below are some examples of consuming the `Uploader` component:
//usage demo 1: standalone multipart/form-data upload when files are dropped into the component //usage demo 1: standalone multipart/form-data upload when files are dropped into the component
var Demo1 = { var Demo1 = {
controller: function() { controller: function() {
treturn { return {
upload: function(files) { upload: function(files) {
Uploader.upload({method: "POST", url: "/api/files", {data: {files: files}}}) Uploader.upload({method: "POST", url: "/api/files", data: {files: files}}).then(function() {
alert("uploaded!")
})
} }
} }
}, },
@ -510,7 +512,11 @@ var Demo1 = {
] ]
} }
} }
```
[Demo](http://jsfiddle.net/vL22kjvs/5/)
```javascript
//usage demo 2: upload as base-64 encoded data url from a parent form //usage demo 2: upload as base-64 encoded data url from a parent form
var Demo2 = { var Demo2 = {
Asset: { Asset: {
@ -524,8 +530,10 @@ var Demo2 = {
return { return {
files: files, files: files,
save: function() { save: function() {
Uploader.serialize(files).then(function(files) { Uploader.serialize(files()).then(function(files) {
Asset.save({files: files}) Demo2.Asset.save({files: files}).then(function() {
alert("Uploaded!")
})
}) })
} }
} }
@ -533,11 +541,18 @@ var Demo2 = {
view: function(ctrl) { view: function(ctrl) {
return [ return [
m("h1", "Uploader demo"), m("h1", "Uploader demo"),
m("p", "Drag and drop a file below. An alert box will appear when the upload finishes"),
m("form", [ m("form", [
m.component(Uploader, {onchange: ctrl.files}), m.component(Uploader, {onchange: ctrl.files}),
m("button[type=button]", {onclick: ctrl.save}) ctrl.files().map(function(file) {
return file.name
}).join(),
m("button[type=button]", {onclick: ctrl.save}, "Upload")
]) ])
] ]
} }
} }
``` ```
[Demo](http://jsfiddle.net/vL22kjvs/6/)

View file

@ -496,10 +496,10 @@ m.mount(document, {controller: todo.controller, view: todo.view});
</script> </script>
``` ```
---
This example is also available as a [jsFiddle](http://jsfiddle.net/milesmatthias/fbgypzbr/1/). This example is also available as a [jsFiddle](http://jsfiddle.net/milesmatthias/fbgypzbr/1/).
---
## Notes on Architecture ## Notes on Architecture
Idiomatic Mithril code is meant to apply good programming conventions and be easy to refactor. Idiomatic Mithril code is meant to apply good programming conventions and be easy to refactor.