【问题标题】:Tracking upload progress in itemView在 itemView 中跟踪上传进度
【发布时间】:2015-04-06 15:45:48
【问题描述】:

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

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

ItemView 的相关部分

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

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

【问题讨论】:

  • 向项目视图添加属性怎么样?它们是视图与其模型之间的一对一腐蚀?
  • 向项目视图添加属性怎么样?它们是视图与其模型之间的一对一腐蚀吗?顺便说一句,您可以通过监听模型的 request 事件来监听模型请求何时开始,以及通过监听其 sync 事件返回。
  • 好吧,我不想保存这些信息。有没有一种方法可以让我忽略更新的字段,或者我设置它是否重要,因为它永远不会被保存?
  • 可以直接在模型上设置属性。比如model.progress = 'loaded'。调用 model.set() 意味着您正在更新数据库的模型表示。也就是说,如果您使用.set(),您可以在调用.save() 之前对模型进行预处理,然后手动删除progress 属性。
  • 如果我想在 ajax 上传的项目视图中有一个进度条。也许是我对 Javascript 的无知阻止了我。但是我想做的是设置一个变量,当它更新时,我会重新渲染 itemview。这不是处理这个问题的正确方法吗?

标签: javascript ajax backbone.js marionette


【解决方案1】:

通常,您可能有多个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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-01
    • 2014-06-03
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    • 2016-06-02
    • 2017-09-12
    相关资源
    最近更新 更多