1

每次发生变化时,我都想在模型上触发自动保存,但前提是变化来自 UI(即视图)。我的意思是,如果更改来自数据库,那么再次保存它没有意义,它只是来自数据库......

但是fetch并且save可以触发change事件(fetch因为它可能带来模型的不同状态,并且可以为新创建的save模型带来id

所以在这种情况change下,我想知道是什么导致了这种变化。

例如,这是来自视图的呼叫吗?:

this.model.set("foo", "bar"); //triggers a change event as foo's value changed

还是同步操作的结果?:

model.fetch(); //triggers a change event as the model changed in the DB
model.save(); //triggers a change event as the id was empty 

有没有办法区分它们?

set一旦我想到的解决方案是用一种方法包装对模型的视图调用setAttribute,并触发一个自定义changeDueToUIAction事件,但我确信这已经解决了,而且我确信以更好的方式......

还是我完全错过了一些东西,问题是我问错了问题?

4

1 回答 1

1

我想说有几个自定义解决方案或多或少涉及样板。还有一个简单的,尽管仍然添加了一些样板。
(没有对 Backbone 进行任何重大更改)您无法知道更改的来源(考虑一下,您将如何在Model#set方法中访问它?)。您在侦听器中可以访问的是 2 个对象。第一个是改变的模型。其次是调用 set 方法时传递的选项。所以我想你可以做这样的事情:

// in the view
this.model.set('foo', 'bar', {'isFromUI': true});

// in your model
this.listenTo(this, 'change', function(model, flags) {
  if(flags && flags.isFromUI) this.save();
});
于 2013-04-09T08:24:36.600 回答