2013-03-12 103 views
0

我有一个骨干应用程序,它从url中读取svn文件路径,然后“ls”是它给出的路径。通常情况下,它只是列举了表中ls的结果。但是我想要做的是检查路径是否实际上只对应一个特定的文件,在这种情况下,取而代之地显示文件的内容。backbone.js根据ajax请求的结果采取不同的行动

这样做会是一个很好的主干惯用方式吗?现在在我所称为目录模型解析功能,我想这样做是这样的:

parse: function(response, options) { 
    if (response.length == 1 && response[0].type == "file") { 
     // what to do here? 
    } 
    this.get('entries').reset(response); 
    $("#indicator").hide(); 
    $('#directory-contents').show(); 
    this.trigger('change'); 
    return {}; 
    }, 

所以我很想只是一种让一个Ajax请求获取文件这里的内容(即在// what to do here?),但a)直接做一个Ajax请求自己似乎不是很好,和b)我觉得我把两个模型混合成一个。现在我的DirectoryView可能需要检查某种标志来判断它是实际呈现一个目录还是一个特定的文件。

有更好的方法来处理这个问题的任何想法?

回答

2

OK,审查意见,并了解您的域多一点之后,我会建议使用以下方法:

  • 创建一个代表一个文件系统节点的FSEntry模型(索引节点如果你愿意)。关键的一点是可以代表一个目录或文件
  • FSEntry应该有一个type字符串属性,可以是“目录”,“文件”,“符号链接”等
  • 基本fsEntry.fetch()应该只是加载元数据,包括type字段。
  • 渲染它的视图可以响应模型事件进行渲染。根据模型实例的type,进行适当渲染(或者如果愿意,可以在视图正文中换入不同的模板)
  • 如果type是'文件',请让视图调用fsEntry.fetchContent()并响应对应的change:content事件来渲染文件内容
  • 稍后您可以向模型添加逻辑以缓存content数据,并且如果缓存中有新数据则不会重新提取它,但这是一种只有在所有功能都是正确。

基于您的代码示例的备注:不要在模型或集合代码中操作DOM!这是MV * facepalm失败。

+0

我没有计划在模型中操作DOM,但如果我想要文件的实际内容,我将不得不做出单独的ajax请求。有没有更好的办法可以做,而不仅仅是在上面的'parse'函数中有一个'$ .ajax(...)'? – Alec 2013-03-12 17:09:41

+1

那么,你可以设置一个事件处理程序,以便在'change:type'事件处理时,如果文件内容尚未加载,那么可以在该点处获取它。你也可以创建一个独立的'loadContent'方法来让你的视图可以调用。 – 2013-03-12 17:26:35

+1

我认为这是你有一个FSEntry与2组数据:元数据和文件内容。遵循骨架模式,其中'fetch'获取元数据,并制作另一个加载内容的'fetchContent'方法。一旦元数据到达,我不喜欢模型自动获取内容的想法,尽管您可以这样做。我宁愿让一个控制器或视图告诉模型来获取内容。 – 2013-03-12 17:29:56