我正在使用jquery和backbone.js开发并遇到了这样的情况:需要复制模型,但需要对它们进行深层复制,以便复制之间不存在引用关系。模型可以将其他模型作为属性。模型可以将匿名函数作为属性。
因此,我正在尝试创建一个算法来深度克隆大部分backbone模型。我期望在此复制中应该删除所有绑定(对于新实例),因此我不担心保留它们。
目标:
- 能够复制所有简单变量(字符串、整数、浮点数等)并将其存储到新模型中,名称相同。 - 已完成,使用toJSON创建一个新的JSON对象,可以传递给set()。此对象仅包含简单属性,即不包括分配给函数或其他模型的属性。 - 能够复制一些变量被分配给的匿名函数,而不预先知道函数/属性名称。 - 如果我知道赋给函数的属性名称,我可以复制它。但如果模型是新的或未知的,则没有那些信息。 - 如果一个属性是另一个backbone模型,则对该属性递归调用深层复制算法。 - 无法使用原生backbone方法检查属性是否为backbone模型,正在寻找解决方法。
以下是我目前所拥有的简化版本:
``` /** * Performs a deep copy of a backbone.js model * All bindings for the copy are lost * @param orgModel - the original model to copy */ function deepCopyModel(orgModel) { var dupModel = Backbone.Model.extend({});
var orgAttributes= orgModel.toJSON();
var keepAttr=_.keys(orgAttributes); //remove any special cases keepAttr=_.without( keepAttr , 'specialCase1', 'specialCase2' ); //or keepAttr=_.difference(keepAttr, ['specialCase1', 'specialCase2'] );
//remove undefined values keepAttr=_.filter(keepAttr,function(key) { return ( typeof(attributes[key])!="undefined" ); }); //grab the resulting list of attributes after filtering var result=_.pick(attributes,keepAttr); //assign attributes to the copy using set dupModel.set(result);
//TODO: Implement deep copy of functions
//TODO: Implement deep copy of inner models
return dupModel; } ```
非常感谢您提供的任何帮助或见解。谢谢!
因此,我正在尝试创建一个算法来深度克隆大部分backbone模型。我期望在此复制中应该删除所有绑定(对于新实例),因此我不担心保留它们。
目标:
- 能够复制所有简单变量(字符串、整数、浮点数等)并将其存储到新模型中,名称相同。 - 已完成,使用toJSON创建一个新的JSON对象,可以传递给set()。此对象仅包含简单属性,即不包括分配给函数或其他模型的属性。 - 能够复制一些变量被分配给的匿名函数,而不预先知道函数/属性名称。 - 如果我知道赋给函数的属性名称,我可以复制它。但如果模型是新的或未知的,则没有那些信息。 - 如果一个属性是另一个backbone模型,则对该属性递归调用深层复制算法。 - 无法使用原生backbone方法检查属性是否为backbone模型,正在寻找解决方法。
以下是我目前所拥有的简化版本:
``` /** * Performs a deep copy of a backbone.js model * All bindings for the copy are lost * @param orgModel - the original model to copy */ function deepCopyModel(orgModel) { var dupModel = Backbone.Model.extend({});
var orgAttributes= orgModel.toJSON();
var keepAttr=_.keys(orgAttributes); //remove any special cases keepAttr=_.without( keepAttr , 'specialCase1', 'specialCase2' ); //or keepAttr=_.difference(keepAttr, ['specialCase1', 'specialCase2'] );
//remove undefined values keepAttr=_.filter(keepAttr,function(key) { return ( typeof(attributes[key])!="undefined" ); }); //grab the resulting list of attributes after filtering var result=_.pick(attributes,keepAttr); //assign attributes to the copy using set dupModel.set(result);
//TODO: Implement deep copy of functions
//TODO: Implement deep copy of inner models
return dupModel; } ```
非常感谢您提供的任何帮助或见解。谢谢!
function(y) { var x=y; return function() { x++; console.log(x); }; }
。 - tucuxi