2010-11-13 92 views
0

我有一个ObjectManager,它保存对所有创建的对象的引用。问题在于ObjectManager没有引用创建的对象,而是似乎正在创建它的一个新实例。任何帮助,将不胜感激。谢谢!对象没有通过作为参考

var Fieldset = function (options) { 
    var fieldset = ($.extend(true, { 
     id: '',//Let's assume this has been overridden with 'MyFieldset' via the options param. 
     title: '', 
     accordion: '', 
     fields: [], 
     hidden: false, 
     Show: function() { $('#' + this.id).show() }, 
     Hide: function() { $('#' + this.id).hide() } 
    }, options)); 

    if (fieldset.id != null && fieldset.id != '') 
     ObjectManager.fieldsets[fieldset.id] = fieldset;//Save a reference to this object in the ObjectManager, so I can call ObjectManager.GetFieldset('MyFieldset'). A reference is only saved if an id is provided. 

    log(ObjectManager.GetFieldset(fieldset.id) == fieldset);//true 
    return fieldset; 
} 

编辑:

对不起,我还以为是清楚,我想这事。 ObjectManger没有什么特别之处。它只有一个属性和Get方法为我的每个对象。为了简单起见,我只包含fieldset属性和Getter。我希望这清除了我的意图。

var ObjectManager = 
{ 
    fieldsets: {}, 
    GetFieldset: function (id) { return this.fieldsets[id]; } 
}; 

EDIT2:

一些测试后,我发现了一些奇怪的...希望有人能为什么会这样向我解释。

var myFieldset = new Fieldset({ id: 'MyFieldset' }); 
log(myFieldset == ObjectManager.GetFieldset('MyFieldset'));//I just found that it is true in this case... 
//... However, this is not the normal way I create Fieldsets... This is: 
var editForm = new Form({ 
    dataStore: function() { return ClientsDS; }, 
    id: 'ClientEditForm', 
    fieldSets: [ 
     new Fieldset({ 
      id: 'ClientDetailsFieldSet', 
      title: 'Details', 
      fields: [ 
      new Field({ id: 'ClientID', name: 'ID', property: 'ID', fieldType: 'hidden', value: '0' }) 
      ] 
     }) 
    ] 
}); 
log(editForm.fieldSets[0] == ObjectManager.GetFieldset('ClientDetailsFieldSet'));//false 
+1

您还没有表明自己希望这段代码做实际上做,也没有什么。请澄清。 – cdhowie 2010-11-13 09:05:40

+1

对象管理器从问题 – 2010-11-13 09:13:12

+1

中缺失您的编辑没有很好地解决问题。目前还不清楚**代码实际上做了什么**和**你期望它做什么**。不要让我们猜测。 – cdhowie 2010-11-13 09:45:42

回答

0

嗯,你的Fieldset构造函数返回一个对象。也许尝试将它称为Fieldset({...})而不是new Fieldset({...})

+0

抱歉,编辑过程中出现错误。仍然返回false。 (更新) – Brett 2010-11-13 10:10:22

+0

另外,单独记录每个表明它们包含相同的数据,但它们不是同一个对象。 – Brett 2010-11-13 10:11:35

+1

顿悟后更新了我的答案... – cdhowie 2010-11-13 10:13:38

0

我假设你的Form类看起来像你的字段集类,即它$.extends(使一个深拷贝),你给它与它内部的“原型”的选项。返回的对象是扩展的原型,而不是原型对象扩展的options。试着改变你的$ .extend参数的顺序(把选项放在第二位,把内部的“原型”放在第三位),看看它是否改变了什么。另外,发布您的Form类:-)

+0

误解了jQuery扩展函数,所以我更新了我的答案。对不起,如果这听起来非常混乱 - 简而言之,如果你的Form类以'var form =($ .extend(true,{lotsOfStuff},options)开始;'尝试交换{lotsOfStuff}'和'options'。 – Frode 2010-11-13 10:55:29

+0

不是问题.. – Brett 2010-11-15 01:27:54

+0

嗯,我不知道那么,我仍然认为你也需要发布你的Form类,但是我们不知道你的Form构造函数是如何处理字段集的(我仍然打赌它一些复制;)) – Frode 2010-11-15 09:21:19

1

在EDIT2:

你的对象是不相等的,因为他们是不一样的。等号运算符没有说这两个对象具有相同的键/值对,当它们是相同的对象时它们是相等的。

例如,

var a = b = {a: 1, b:2}; 
//This is b = {a: 1, b: 2}; a = b; In case you were wondering 
a === b //true 

var a = {a: 1, b: 2}, 
    b = {a: 1, b: 2}; 
a === b //false 
+0

问题是他们不是同一个对象。日志记录显示它们不是同一个对象。 – Brett 2010-11-15 01:25:50

+0

将您的代码发布到jsFiddle上,使用所有功能。 – Drew 2010-11-15 14:24:32