【问题标题】:Backbone Model.sync proxy why is the second parameter (model) is obligatoryBackbone Model.sync proxy 为什么第二个参数(model)是必须的
【发布时间】:2016-05-15 03:58:37
【问题描述】:

我对 Model.sync 函数的直观行为感到好奇。

sync 的第二个参数是模型,当它是Backbone.sync 时,它确实有意义。但是当它充当代理时:

var MyModel = Backbone.Model.extend({baseUrl})
var myModel = new MyModel({id})
console.log(myModel.url()) // will issue baseUrl + id path
myModel.sync(method, myModel)

传递与您调用同步的相同模型有点多余。

如果你不通过它会弹出非常不友好的错误:

backbone.js:1907 未捕获的错误:必须指定“url”属性或函数

这是在设计上完成的。当您仔细查看文档时,他们清楚地声明第二个参数是强制性的。

我试图了解不让它变得有点灵活的原因是什么,并在库级别通过这个模型而不是自己制作它?

类似这样,非常愚蠢的例子来证明我在做什么:

// Proxy `Backbone.sync` by default -- but override this if you need
// custom syncing semantics for *this* particular model.
sync: function() {
  var args = arguments.splice(2, 0, this); // << make second attribute correspond to the this model
  return Backbone.sync.apply(this, args);
},

澄清:

Model.sync 上的文档说

同步 model.sync(方法,模型,[选项]) 使用 Backbone.sync 将模型的状态持久化到服务器。可以覆盖自定义行为。

所以在我的情况下,我尝试使用“补丁”方法通过以下步骤同步模型:

一个。使用数据更新模型
湾。使用同步方法同步此数据

 this.model.set(data)
 this.model.sync('patch', this.model)

【问题讨论】:

  • 我不清楚你真正想知道什么。请说清楚。请注意,sync() 不打算在模型实例之外使用,它实际上是私有的,仅由fetch()、save() 和destroy() 使用。可能有一个利基用例可以/应该在外面使用。
  • @try-catch-finally 澄清了,你也回答了问题。不过,如果这不打算在模型之外使用,为什么它会在文档中作为公共 api 发布?

标签: design-patterns backbone.js


【解决方案1】:

sync() 方法是一种私有的(或更好的:受保护的),程序员想要使用fetch()、save() 和destroy()。

但是由于sync() 严格定义了如何“crud”(创建、读取、更新删除);使用 AJAX,如何发出和解析请求,它必须提供一种方法来允许程序员改变这种行为。这就是他们的意思,当他们说

sync model.sync(method, model, [options]) 使用Backbone.sync 将模型的状态持久化到服务器。可以覆盖自定义行为。

因此,Backbone 必须为sync() 定义一些接口,以便所有公共方法都可以传递一个数据源,模型。


请注意,可能有合适的修补方法,因为save() 采用选项patch: true。 See the source in line 645

 var method = this.isNew() ? 'create' : (options.patch ? 'patch' : 'update');

【讨论】:

  • 谢谢,这就是我现在要追求的。解释得很好。
猜你喜欢
  • 1970-01-01
  • 2022-01-15
  • 2019-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-04
  • 2010-11-29
相关资源
最近更新 更多