我需要创建一个Ember组件来选择一个文件。 我的页面将包含多个“上传组件”
我已经阅读了一篇试图实现它的帖子:(https://stackoverflow.com/questions/9200000/file-upload-with-ember-data)但是UploadFileView直接链接到控制器。 我想要更通用的东西...
我想从视图中删除App.StoreCardController.set('logoFile'..)依赖项,或从模板中传递字段(logoFile)......
有任何改进此代码的想法吗?
App.UploadFileView = Ember.TextField.extend({
type: 'file',
attributeBindings: ['name'],
change: function(evt) {
var self = this;
var input = evt.target;
if (input.files && input.files[0]) {
App.StoreCardController.set('logoFile', input.files[0]);
}
}
});
和模板:
{{view App.UploadFileView name="icon_image"}}
{{view App.UploadFileView name="logo_image"}}
答案 0 :(得分:14)
我完成了一个完整的示例,以显示此操作
https://github.com/toranb/ember-file-upload
这是基本的把手模板
<script type="text/x-handlebars" data-template-name="person">
{{view PersonApp.UploadFileView name="logo" contentBinding="content"}}
{{view PersonApp.UploadFileView name="other" contentBinding="content"}}
<a {{action submitFileUpload content target="parentView"}}>Save</a>
</script>
这是自定义文件视图对象
PersonApp.UploadFileView = Ember.TextField.extend({
type: 'file',
attributeBindings: ['name'],
change: function(evt) {
var self = this;
var input = evt.target;
if (input.files && input.files[0]) {
var reader = new FileReader();
var that = this;
reader.onload = function(e) {
var fileToUpload = reader.result;
self.get('controller').set(self.get('name'), fileToUpload);
}
reader.readAsDataURL(input.files[0]);
}
}
});
这是控制器
PersonApp.PersonController = Ember.ObjectController.extend({
content: null,
logo: null,
other: null
});
最后这是w / submit事件的视图
PersonApp.PersonView = Ember.View.extend({
templateName: 'person',
submitFileUpload: function(event) {
event.preventDefault();
var person = PersonApp.Person.createRecord({ username: 'heyo', attachment: this.get('controller').get('logo'), other: this.get('controller').get('other') });
this.get('controller.target').get('store').commit();
}
});
如果您启动django应用程序
,这将在文件系统上删除2个文件答案 1 :(得分:10)
编辑(2015.06):刚创建了基于组件的新解决方案。
此解决方案提供带有预览和删除图标的上传按钮。
附: fa
类为Font Awesome
组件把手
<script type="text/x-handlebars" data-template-name='components/avatar-picker'>
{{#if content}}
<img src={{content}}/> <a {{action 'remove'}}><i class="fa fa-close"></i></a>
{{else}}
<i class="fa fa-picture-o"></i>
{{/if}}
{{input-image fdata=content}}
</script>
组件JavaScript
App.AvatarPickerComponent = Ember.Component.extend({
actions: {
remove: function() {
this.set("content", null);
}
}
});
App.InputImageComponent = Ember.TextField.extend({
type: 'file',
change: function (evt) {
var input = evt.target;
if (input.files && input.files[0]) {
var that = this;
var reader = new FileReader();
reader.onload = function (e) {
var data = e.target.result;
that.set('fdata', data);
};
reader.readAsDataURL(input.files[0]);
}
}
});
用法示例
{{avatar-picker content=model.avatar}}
旧答案
我拿了 Chris Meyers例子,我把它缩小了。
模板
{{#view Ember.View contentBinding="foto"}}
{{view App.FotoUp}}
{{view App.FotoPreview width="200" srcBinding="foto"}}
{{/view}}
的JavaScript
App.FotoPreview= Ember.View.extend({
attributeBindings: ['src'],
tagName: 'img',
});
App.FotoUp= Ember.TextField.extend({
type: 'file',
change: function(evt) {
var input = evt.target;
if (input.files && input.files[0]) {
var that = this;
var reader = new FileReader();
reader.onload = function(e) {
var data = e.target.result;
that.set('parentView.content', data);
}
reader.readAsDataURL(input.files[0]);
}
},
});
答案 2 :(得分:1)
Marek Fajkus你不能使用JQuery的.serialize,它在JQuery UI docs的文档中没有提到文件上传
但是,您可以使用JQuery Upload Plugin
实际上确实提到了它,它说: &#34 ;.来自文件选择元素的数据未被序列化。&#34;
答案 3 :(得分:1)
如果要上传多个文件,您可能需要使用
{{input type='file' multiple='true' valueBinding='file'}}
^^^^
这是一种可以在普通HTML上传中使用的解决方案。
此外,您可以使用'valueBinding'
,这样您就可以在组件中针对该值设置观察者。