2015-04-06 75 views
1

我正在开发带有Marionette/Backbone的应用程序。该应用程序需要通过AJAX调用上传文件(有这个工作)。我想告诉用户何时能够选择上传的文件并继续修改它们。我不知道当我有Model和ItemView时跟踪进度的最佳做法。我可以将它放在属性中,但据我所知,所有属性都会在同步到服务器时保存到数据库中。但ItemView需要能够听取模型的完成时间,但我不确定何时以及在哪里做到这一点。在itemView中跟踪上传进度

我已经解决了这个问题的一个更基本的解决方案,但它需要在Marionette/Backbone框架内工作。 ItemView控件

modelEvents: { 
    'change': 'fieldsChanged' 
}, 

fieldsChanged: function() { 
    this.render(); 
}, 
+0

增加一个属性项目视图如何?它们是视图与其模型之间的一对一腐蚀? – seebiscuit

+0

如何将项目添加到项目视图?它们是视图与其模型之间的一对一腐蚀?顺便说一句,你可以在模型请求开始时听取模型的'request'事件,以及通过监听它的'sync'事件返回。 – seebiscuit

+0

好的是我不想保存信息。有没有办法可以忽略更新的字段,或者如果我设置它,它会永远不会被保存吗? –

回答

0

有关部分一般情况下,你可能有多个ItemView意见,每个都有自己的模型。要跟踪在该视图模型中发生的更改,通常会保留有关该模型的状态信息。为确保这些数据在您的ItemView方法中可用,将范围限制到此变量的唯一方法是将其作为视图本身的属性。所以,在你的例子你可能会做这样的事情,

onClick: function (event) { 
    this.progress = 'pending'; 
    this.model.save({ filename: this.file Name }) 
} 

而当模型回来,你会怎么做

fieldChanged: function() { 
    this.progress = 'loaded'; 
    this.render(); 
} 

唯一的其他方式来储存模型元数据,并使其可在视图的上下文中将通过全局变量,但是这样做的缺点是双重的。在基本水平上,你想避免污染你的全球分数。更有问题的是,如何将全局变量引用到您的特定视图模型。通过允许视图跟踪所有模型元数据,您可以解决这两个问题,并可以更好地与最佳实践保持一致。

或者,也可能更自洽,您可以在模型本身上设置进度属性。即使模型从一个视图传递到另一个视图,状态信息也会遵循模型。和你的氛围会喜欢这样

onClick: function (event) { 
    this.model.progress = 'pending'; 
    this.model.save({ filename: this.file Name }) 
} 

而当模型回来,你会怎么做

fieldChanged: function() { 
    this.model.progress = 'loaded'; 
    this.render(); 
}