2012-01-11 48 views
1

我正在编写一个Backbone应用程序,我无法控制服务器返回的实体。Backbone.js:如何处理模型和服务器响应之间的区别

事实证明,对于我来说,对于服务器所使用的JSON来说,数据的内部表示方式稍有不同,这对我来说很方便。在一个方向上,事情很简单:我可以编写一个Model.parse()方法,该方法将服务器返回的JSON作为输入并返回我的对象​​的属性。

我不太确定在另一个方向做什么。我无法找到当我的对象被序列化保存时调用的方法。有Model.toJSON(),但在模型保存前似乎没有使用它。

我该如何处理这种差异?

回答

2

首先 - annotated source是寻找有关骨干问题的答案的最佳位置。在源

寻找Backbone.sync你可以看到,该模型是使用JSON.stringify(model.toJSON())(不使用emulateJSON假设)连载所以重写此方法应该达到你所需要的。如果没有减少测试用例,我无法解释为什么这不起作用。

较长的答案是,要完全控制服务器 - 客户端同步,您应该编写自己的Backbone.sync实现。该方法非常简单(请参阅带注释的源代码),如果您只想进行简单更改,则可以简单地包装原始同步。

例如:

function mySyncFunction(method, model, options){ 
    if(method == 'create' || method == 'update'){ 
    options.contentType = 'application/json'; 
    options.data = model.serializeForServer(); //You will need to write this method 
    } 
    return Backbone.sync(method, model, options); 
} 

要使用自定义同步方法只是声明它为模型的一部分

var myModel = Backbone.Model.extend({ 
    ... 

    "sync": mySyncFunction, 

    ... 
}); 
+0

谢谢!我为Backbone使用localStorage适配器,它不调用toJSON方法。我已经手动修补它,我也会检查如何将它推向上游 – Andrea 2012-01-11 15:39:19

相关问题