【问题标题】:Checking for any dirty Backbone model data within collection检查集合中的任何脏主干模型数据
【发布时间】:2013-08-23 22:19:17
【问题描述】:

当用户在不同的 Backbone 集合模型之间切换时(通过单击表格行),我需要“唠叨”用户未保存的更改。我搜索了“检查主干模型脏数据”(例如),但没有找到任何确定的内容。

我使用underscore's "some"isEqual functionality 以如下方式完成了此操作,“some()”足以确定是否有任何未保存的更改(相反这些精确的变化可能是什么),特别是因为模型属性实际上是一个对象数组。

var anyDirty = _.some(myCollection.models, function(model) {
    return !_.isEqual(model.get('nodes'), model.previousAttributes()['nodes]);
});

我是 Backbone 的新手,我想知道这是否是一种可接受的用于临时检查脏模型数据的方法。或者,Backbone 是否为此目的提供了某种内置功能,而我最初的谷歌搜索没有发现这些功能?

【问题讨论】:

  • 感谢您指出这一点。现在我意识到我的问题写得不够具体。我想我想知道特定集合中的 any 模型是否已更改。在这种情况下,我对 _.some 的使用似乎仍然适用,但在迭代器内部,我可以使用 'model.hasChanged()' 而不是 _.isEqual()
  • 您可以改为监听change 事件何时触发。将其作为您的收藏中的一个状态。将集合同步回服务器后清除它。然后只检查该状态属性。我认为change 在创建新模型时也会被触发,因此您可能还需要检查isNew()
  • @j03w 谢谢,但是持久化状态意味着管理状态,管理的状态越多,基于状态管理不正确的逻辑错误的可能性就越高——状态是邪恶的,必要时应该避免

标签: javascript backbone.js underscore.js dirty-data


【解决方案1】:

除了“nodes”之外,我还有一个需要监控的属性,所以我改用 changedAttributes():http://backbonejs.org/#Model-changedAttributes:

var anyDirty = _.some(myCollection.models, function(model) {
    return model.changedAttributes();
});

这可能是一个不完美的解决方案,它似乎会返回一个 changedAttributes 对象,即使该属性已更改回其原始值。因此,从长远来看,我几乎需要的是对原始数据进行快照并与之进行比较。尽管如此,使用 model.changedAttributes() 是比我第一次发布的更简洁的替代方法。

【讨论】:

  • 你会发现 changedattributes 包含自上次 'set' 而不是上次 'sync' 的那些
猜你喜欢
  • 1970-01-01
  • 2015-05-30
  • 2015-08-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-05
  • 2015-03-13
  • 2012-04-29
相关资源
最近更新 更多