2013-07-05 35 views
0

我的应用程序允许用户管理他们的文档。当创建一个用户时,用户必须手动输入文档内容或从他们的计算机中选择一个文件(这会将许多格式转换为用户的HTML)。解决疑虑的正确方法是?

目前,我有一个简单FileUploaderView这基本上是一个<input type="file">侦听到文件的变化,并与像{ file: { type: SOME_TYPE' }, content: SOME_CONTENT }对象更新视图的value财产。

然后,DocumentsNewController侦听其中的更改并将支持的文件转换为HTML,并将结果放入文档正文中。

但是,这样做感觉简直是错误的,不允许简单的重用(我希望能够做到)。

App.DocumentsNewController = Ember.ObjectController.extend 
    # ... stuff ... 

    handleDocumentUpload: (-> 
    doc = @get 'documentUpload' 
    return unless doc 

    Ember.run => 
     @set 'uploadError', false 
     @set 'unsupportedFile', false 
     @set 'processingUpload', true 

    type = doc.file.type 
    text = '' 

    try 
     if type.match /^text\// 
     text = doc.content 
     # Convert new lines to br's and paragraphs 
     text = '<p>' + text.replace(/\n([ \t]*\n)+/g, '</p><p>').replace('\n', '<br />') + '</p>' 
     else if type == 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' 
     text = new DOCX2HTML(doc.content).convert() 
     else 
     @set 'unsupportedFile', true 
    catch error 
     @set 'uploadError', true 
    finally 
     @set 'text', text 
     Ember.run => @set 'processingUpload', false 
).observes 'documentUpload' 

而且模板是一样的东西

... stuff ... 

{{view App.FileUploaderView valueBinding="documentUpload" accept="text/*"}} 

什么是正确的方式来重构文件转换的东西了控制器的?

我希望能够做一些事情,如:

{{documentHandler resultBinding="documentUpload"}} 

,并在控制器

App.DocumentsNewController = Ember.ObjectController.extend 
    # ... stuff ... 

    handleDocumentUpload: (-> 
    if doc = @get 'documentUpload' 
     @set 'text', doc 
).observes 'documentUpload' 

我首先想到的是让一个DocumentHandlerView这将显示输入字段,显示微调,显示错误,解析文档并将结果分配给result(并且由于控制器的模板具有resultBinding="documentUpload",HTML会触发控制器的观察者)。

使用视图可以更容易重用,但我仍然认为解析文档不是视图的工作。

有没有更好的方法?

+0

在您的控制器中有逻辑接缝到目前为止的正确位置 – intuitivepixel

+0

但我希望能够在其他控制器中重用它。在我需要做文档处理的每个控制器中复制它太奇怪了。 –

+0

你可以创建一个控制器混合,然后从中扩展你的控制器从 – intuitivepixel

回答

0

仔细阅读您的问题后,最好记住的是创建一个Ember.Mixin,然后将其用于所有需要相同功能的控制器。

实施例从余烬API docs采取:

App.Editable = Ember.Mixin.create({ 
    edit: function() { 
    console.log('starting to edit'); 
    this.set('isEditing', true); 
    }, 
    isEditing: false 
}); 

// Mix mixins into classes by passing them as the first arguments to 
// .extend. 
App.CommentView = Ember.View.extend(App.Editable, { 
    template: Ember.Handlebars.compile('{{#if isEditing}}...{{else}}...{{/if}}') 
}); 

commentView = App.CommentView.create(); 
commentView.edit(); // outputs 'starting to edit' 

的例子只是概念性的,但它会很容易自己创建一个mixin并把所有的公共逻辑在那里。

希望它有帮助。

+0

是的,我想到了它 - 这是一个很好的方式来分享控制器之间的一些行为。尽管如此,我并不完全确定处理文档上传是该控制器的工作。也许控制是一种方式? –

相关问题