【问题标题】:JQuery Widget - Pass options by referenceJQuery Widget - 通过引用传递选项
【发布时间】:2011-07-28 18:04:37
【问题描述】:

我有两个 JQuery 小部件,一个是一种“主”小部件,另一个可以视为子小部件。孩子负责收集主要所需的特定数据。 main 用于 AJAX 请求。因此,main 有一组发送到服务器的选项。其中一个选项也是子选项中的一个选项。

为了更清楚地说明这一点,我有一个主小部件,它有几个选项。然后它创建并附加一个子小部件。这个子小部件有一个附加选项,在发送 AJAX 请求之前需要在主小部件中填写该选项。为了使这项工作,我传递给孩子:this.options.someArray

这很好用,但是当子小部件中的该数组发生更改时,它们永远不会返回到主小部件。这意味着 AJAX 请求在此位置发送一个空数组。我该如何解决这个问题?

[如果这不是标准行为 - 我可以发布代码示例]

主 Widget 的代码示例:

$.widget('be.deckEditor', {
  options: {
    deck: { name: "", id: 0, cards: [],  tags: [] }
  },

创建子Widget的代码:

tagEditBox = $('<div>');
tagEditBox.tagEditor({tags:this.options.deck.tags});

小部件_初始化代码:

_init: function () {
  this.options.tags = ['ace','two'];
},

【问题讨论】:

  • 您应该发布代码,因为对数组的共享引用是对数组的共享引用 :-) 如果引用似乎没有被共享,那么您的代码中的某些东西正在做某事就像制作数组的副本; JavaScript 自己不会这样做。
  • 包括应该是相关位的内容。

标签: javascript jquery parameter-passing widget


【解决方案1】:

如果您希望“_init”代码重新设置“标签”内容,则不要将其设置为引用一个全新的数组:

_init: function () {
  this.options.tags[0] = 'ace';
  this.options.tags[1] = 'two';
  this.options.tags.length = 2;
},

您可以编写一个函数来使目标数组包含另一个数组包含的内容;我不认为有一个内置的,但我不记得曾经想要找到这样的东西:

function arrayCopy(src, dest) {
  for (var i = 0; i < src.length; ++i) dest[i] = src[i];
  dest.length = src.length;
}

(仅当您希望目标是完整的副本、长度和所有内容时才需要最后一行。)

【讨论】:

  • 谢谢,我是 javascript 新手,没有意识到这样做会创建一个新数组并更改引用。
  • 关于数组复制功能,有原生技巧:var arr_copy = arr.slice(0);
  • @Johnner 哦,好吧 duhh :-) --- 哦,等一下;这会复制一个数组,这正是我们不想在这里做的事情。我们想从一个源数组复制到一个现有目标数组。
  • 啊,是的...var ar2 = ar2.concat(ar.slice(0));你是对的,没有简单的本机函数:-) ---并且必须在操作之前清空目标数组...olala ^^
猜你喜欢
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 2012-09-20
  • 2014-11-02
  • 1970-01-01
  • 2023-04-04
  • 2015-01-12
  • 2013-09-10
相关资源
最近更新 更多