2012-03-24 65 views
2

我傳遞一個JSON對象作爲參照我的自定義的jQuery插件是這樣的:問題而創建的jQuery插件

var jsonData = { "Name": "John ", "Country": "US" }; 

$("#testdiv").TestWidget({MyData:jsonData}); 

而在我的窗口小部件,我改變這樣的數據:

$.widget("my.TestWidget", { 

    options: { 
     MyData: null 
    }, 
    _create: function() { 
    this.options.MyData.Name = "NewName"; 

    } 
}); 

但是,這種變化並未反映在原始的JSON數據中,因爲顯然jQuery在創建小部件時創建了我的JSON數據的副本!

這是非常不可取的。有什麼辦法來防止數據的複製,而是傳遞對象作爲參考?

以上是我們原始場景的簡化版本。

謝謝

回答

1

恐怕這是不可能的。縱觀jQuery UI source code,你可以看到爲什麼:

_createWidget: function(options, element) { 
    // $.widget.bridge stores the plugin instance, but we do it anyway 
    // so that it's stored even before the _create function runs 
    this.element = $(element).data(this.widgetName, this); 
    this.options = $.extend(true, {}, 
      this.options, 
      $.metadata && $.metadata.get(element)[ this.widgetName ], 
      options); 

    var self = this; 
    this.element.bind("remove." + this.widgetName, function() { 
      self.destroy(); 
    }); 

    this._create(); 
    this._init(); 
}, 

options正在使用$.extend方法複製。

就個人而言,我沒有看到一個理由,你爲什麼想要通過jsonData作爲參考這裏。在我看來,你的設計有問題。你能提供更多關於此事的信息嗎?

+0

我們的用戶界面非常複雜,我們想要構建我們的用戶界面insdie我們的小部件 - 要做到這一點,我們將不得不將數據傳遞給小部件。由於我們支持在小部件內編輯,我們將不得不通過引用傳遞json數據。 感謝 – Amar 2012-03-26 14:04:16

+0

這似乎是個好辦法對我不對,但如果你一定要,我想你可以用合併更改回''jsonData' $ .extend(jsonData,$(「#testdiv」)。TestWidget ( 「選擇」))'。 – alextercete 2012-03-26 15:00:11