2012-03-24 69 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