【发布时间】: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