我试图在下面的插图中描述我的问题。
当页面加载时,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
答案 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模型。如果您的缓存数据反映了最新的更改,这将是到服务器的往返。但是你必须担心保持同步。
希望这有帮助