如何在BackboneJS嵌套模型/集合中使用JSON + Patch?

时间:2014-07-22 04:40:34

标签: json backbone.js nested patch

我的数据模型看起来像下面的JSON结构(只是示例):

var post = {
  id: 123,
  title: 'Sterling Archer',    
  comments: [
    {text: 'Comment text', tags: ['tag1', 'tag2', 'tag3']},
    {text: 'Comment test', tags: ['tag2', 'tag5']}
  ]  
};

在Backbone一侧,它表示为嵌套模型,看起来像下面这样:

var PostModel = Backbone.Model.extend({
   parse: function (response) {
       if (response.comments) {
          response.comments = new Backbone.Collection(response.comments);
       }
       return response;
   }
});

var post = new PostModel(post, {parse: true});

我想将rfc6902 (JSONPatch) specification应用于我的结构。但问题是我的结构不是纯JSON,而是嵌套的模型/集合单元。

我需要有关如何修补嵌套的backbonejs结构的最佳实践,例如官方文档examples

是否有人在BackboneJS应用程序中使用JSON + Patch规范?请与我们分享。

感谢。

编辑:这是简短的例子。假设我需要对我的帖子模型进行一些修改,例如评论添加:

var op = [
  { "op": "add", "path": "/comments/2", "value":  {text: 'Comment test3', tags: ['tag4']}" }
] 

我怎么能用骨干做到这一点:

post.appyPatch(op);

是否有最佳做法或/和主干扩展?

1 个答案:

答案 0 :(得分:4)

我已使用共享代码和Plunker库在json-patch.js中创建了一个可用的应用程序来应用补丁。我已使用应用修补程序的PostModel方法扩展applyPatch。以下是applyPatch方法代码:

var PostModel = Backbone.Model.extend({
    ...    
    applyPatch: function(op) {
        var postStringify = JSON.stringify(this); // JSON string
        var postAttributesJSON = JSON.parse(postStringify); // JSON object. This is same as postAttributes
        var postPatched = jsonpatch.apply_patch(postAttributesJSON, op); // Patch applied
        var changed = this.changedAttributes(postPatched); // Changed attributes
        var self = this; 
        _.each(_.keys(changed), function(key) {
            if(key == 'comments') {
                self.get('comments').set(changed[key], {merge: true});
            }
        }); 
    }
});