保持不同骨干模型同步的方法

时间:2014-07-25 12:38:34

标签: javascript backbone.js marionette

我试图在下面的插图中描述我的问题。

enter image description here

当页面加载时,javascript对象被解析并成为我的骨干模型,名为 obj model 。这个 obj模型被传递给许多不同的独立和模块化子模块,它们以不同的方式使用数据。

除了我处理收藏品的时候,一切都很好。为了让用户能够管理"照片"和#34;评论"我需要为它们创建一个单独的集合/模型数据结构。

如何将更改同步回我的" obj模型"?

class Obj extends Backbone.DeepModel

class Comment extends Backbone.DeepModel

class CommentCollection extends Backbone.Collection
    model: Comment

class Photo extends Backbone.DeepModel

class PhotoCollection extends Backbone.Collection
    model: Photo

1 个答案:

答案 0 :(得分:1)

你的obj模型应该外化。

App.module("Entities",function(Entities,App,Backbone,Marionette,$,_){

    "use strict";

    //these are locally scoped, so they aren't accessable by the your app
    var Obj = Backbone.Model.extend({
        urlRoot:'api/obj',
    });

    var Data = {};

    var API = {
        //wrap request in deferred
        getObjById : function(id, reset){
            var deferred = $.Deferred();
            //returned cached data if we don't request refreshed data
            reset = reset || false;
            if (Data[id] && !reset) {
                return Data;
            }

            this._getObj(id, function(loadedObj) {
                //cache object
                Data[loadedObj.id] = loadedObj
                deferred.resolve(loadedObj);
            });

            return deferred.promise();
        },
        _getObj: function(id, callback) {
            var obj = new Obj({id:id});
            obj.fetch({success:callback});
        },
    };


    //Interface for mucking with Obj model
    App.reqres.setHandler("obj:getObj", function(id) {
        return API.getObjById(id);
    });
}); 

你可以像这样得到一个obj。如果未传入重置,则它将是缓存版本(所有子模块只能通过传入ID或w / e引用相同的obj,您的条件是用于加载):

$.when(App.request('obj:getObj', 123)).done(function(loadedObj) {
  //show view, or do whatever
);

或获取最新数据:

$.when(App.request('obj:getObj', 123, true)).done(function(loadedObj) {
  //show view, or do whatever
);

这些只是如何获取数据的示例。您可以扩展API并为UPDATING数据公开新的处理程序。您可以让每个子模块的控制器监听obj(通过所有监听相同的缓存obj模型),或者只在每次需要时请求最新的obj模型。如果您的缓存数据反映了最新的更改,这将是到服务器的往返。但是你必须担心保持同步。

希望这有帮助