2010-11-13 112 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