2011-02-16 83 views
3

我有一個對象image我可以做類似image.top的事情,它會返回一個值,或者我可以做image.myPoints[0].left,它會返回一個值。我基本上有這個圖像對象,爲我存儲值。我希望能夠把多個image對象數組,所以我可以做這樣的事情:如何存儲對象數組?

$("#toPinpoint").mapImage({ 
       useAjax: false, 
       pinpoints: [ { "top": 50, 
          "left": 280, 
          "width": 200, 
          "height": 200}, 
         { "top": 0, 
          "left": 0, 
          "width": 300, 
          "height": 74 } ] 
      }); 

我用這個函數來創建對象時,針點被添加到該對象。當mapImage函數被調用,這是發生了什麼:

$.fn.mapImage = function(options){ 



    //Set user input options and defaults 
    var optionConfig = $.extend({}, $.fn.mapImage.defaults, options); 

    image=this; 
    this.image = this; 

    // Assign defaults 
    this.previewMode = optionConfig.previewMode; 
    this.pinpoints = optionConfig.pinpoints; 
    image.pinpoints = optionConfig.pinpoints; 
    image.pinpointCount = 0; 
    image.selected = 0; 
    ...} 

此設置圖像的屬性,現在我想用我的應用程序修改的爆破性質,那麼這些image對象保存到一個數組。

我的問題是數組裝載圖像對象,但它似乎填充整個數組與我推入的對象,所以它不會保存我的舊圖像對象。例如,如果我做myArray[0].myPoints[0].left,讓我們說它重新30,然後我推動myPoints [0] .left等於20的另一個圖像對象,我在數組中的第一個圖像對象變成20,而不是將其保存爲30.如果這是解決這個問題的好方法,那將不勝感激。謝謝!

+0

我似乎無法複製這一點。你能發表更詳細的代碼示例嗎?當你說「流行」另一個圖像,你的意思是推?因爲他們有相反的結果。 – 2011-02-16 05:50:20

+0

@安德魯馬歇爾:我的意思是推動抱歉,是的,我會舉一個更詳細的例子 – anthonypliu 2011-02-16 05:53:31

+1

你的反模式顯示:`image = this; this.image = this;`嗨,我是一個循環引用! – ken 2011-02-16 06:51:19

回答

4

使用array.push(x)應添加xarray的末尾。但是,它不會創建x的副本,因此如果您然後再更改xpush()的屬性,那麼您的數組將包含具有更新屬性的x的兩個實例 - 我懷疑這是您所看到的。 (也就是說,您可能會再次更改imagepush()top屬性,而不是創建全新的imagepush())。

+0

我認爲你絕對正確,但我該如何解決這個問題?如何在每次添加時創建此對象的新實例 – anthonypliu 2011-02-16 05:54:29

0
var myArray = new Array(); 

您需要使用「new」關鍵字。

0

我想你讓這個比需要更復雜。

(function($){ 
    $.fn.mapImage = function(options) { 
    var defaults = { /* your defaults here */ }; 

    // Merge default options with passed in options and store 
    options = ($.extend({}, defaults, options)); 

    // Do other stuff 
    }; 
})(jQuery); 

// Backup current pinpoints and modify the current one 
$('#toPinpoints').data('pinpoints-backup', $('#toPinpoints').data('pinpoints').splice()); 
$('#toPinpoints').data('pinpoints')[0].top = 100; 

// Push a new array of pinpoints 
$('#toPinpoints').data('pinpoints').push({"top": 100, "left": 50, "width": 200, "height": 150}); 

要小心jQuery.extend(),因爲它不以遞歸方式操作,所以任何陣列是默認子陣列將被本選項陣列中被完全覆蓋內,合併。

如果您以後需要訪問精確定位數據,則​​可以使用this.data($.extend({}, $.fn.mapImage.defaults, options));之類的東西代替重新分配選項變量來使用jQuery.data()。然後可以通過$('#toPinpoint').data('pinpoints')訪問給定元素的精確位置,這將返回您通過選項傳遞給mapImage()的相同數組。然後你可以用jQuery.each()遍歷所有的精確點。

如果我錯過了你想要做的事情,請告訴我。