2014-07-25 97 views
1

我試圖在下圖中描述我的問題。保持不同骨幹模型同步的方法

enter image description here

頁面加載時,一個JavaScript對象進行解析,併成爲我叫OBJ模型骨幹模型。這個obj模型被傳遞給許多不同的獨立和模塊化的子模塊,它們以不同的方式利用數據。

除了當我處理集合時,一切都很好。爲了讓用戶能夠管理「照片」和「評論」,我需要爲他們創建一個單獨的集合/模型數據結構。

我應該如何將更改同步回我的「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

你是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。如果復位不傳遞,這將是緩存的版本(所有子模塊可以指代相同的OBJ只是通過傳遞ID或W/E的標準是用於加載):

$.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並公佈用於更新數據的新處理程序。您可以讓每個子模塊的控制器監聽obj(所有人都聽同樣的,緩存的obj模型),或者每次需要時請求最新的obj模型。如果您的緩存數據反映最近的更改,這將是服務器的往返行程。但是,你必須擔心保持同步。

希望這會有所幫助