0

jquery-ui 对话框小部件(就像所有其他小部件一样)包装在一个匿名函数中。

在这个函数内部有一个声明为名为 的变量sizeRelatedOptions。我需要从包装闭包外部向该对象添加一个键。实现这一目标的最佳方法是什么?

(function( $, undefined ) {

    var sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });

}( jQuery ) );

编辑#1:上面的代码是jQuery ui的源代码

编辑#2:我现在明白我不能简单地访问那个变量。所以我必须解决这个问题。因此,这里有一些关于我为什么需要这个的更多信息:

我正在扩展 jQuery ui 的对话框小部件以添加另一个 buttonPane。为了在将窗格添加到小部件后使小部件自行调整大小,我想在sizeRelatedOption. (这就是这个问题的第一个问题。)因为_options对话框小部件的功能检查选项是否sizeRelatedOption作为键存在。在这种情况下,它会调用_size调整小部件大小的函数。

希望我让自己有点清楚。

4

5 回答 5

2

您根本无法不直接修改源代码,但这不是您应该考虑的选项,因为由于许多原因,这是一种非常糟糕的做法。

该变量对该范围是私有的,除非该对象使其可以公开访问,否则您的代码必须在声明该变量以访问它的那个范围内或子范围内运行。

但是,如果您尝试更改某些配置选项,小部件已经为此提供了一个API 。

例如,

$('#dialog').dialog({
    height: 500,
    width: 500
});

编辑:如果您可以向我们提供有关您为什么要实现这一目标的更多详细信息,我们可能会为您提供其他选择。

于 2013-08-14T13:43:23.287 回答
0

您可以将其设置为全局变量:

var window.sizeRelatedOptions = { // now it's a global

最好让您的匿名函数返回变量,但是:

var myvar = (function( $, undefined ) {

  var sizeRelatedOptions = {
    buttons: true,
    height: true,
    //etc
  };
  var returnvar = sizeRelatedOptions; // in case sizeRelatedOptions is modified

  $.widget( "ui.dialog", {
      //widget code
  });

  return returnvar;

}( jQuery ) ); // now myvar contains the same data
于 2013-08-14T13:43:37.377 回答
0

将窗口对象传递给函数,然后您可以将方法和属性附加到它。

(function( $, window, undefined ) {

    window.sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });

}( jQuery, window ) );
于 2013-08-14T13:43:50.580 回答
0

您应该在全局范围内声明此变量。您可以使用$.extend将属性添加到现有对象。

window.sizeRelatedOptions  = {};

(function( $, undefined ) {
    $.extend(sizeRelatedOptions ,  {
        buttons: true,
        height: true,
        //etc
    });

    $.widget( "ui.dialog", {
        //widget code
    });
}( jQuery ) );
于 2013-08-14T13:44:14.003 回答
0
var accessor = (function( $, undefined ) {

    var sizeRelatedOptions = {
        buttons: true,
        height: true,
        //etc
    }

    $.widget( "ui.dialog", {
        //widget code
    });
    return {
       getSizeRelatedOptions: function () { return sizeRelatedOptions; }
    }
}( jQuery ) );
accessor.getSizeRelatedOptions();

我认为不修改小部件的源是不可能的。

于 2013-08-14T13:44:56.507 回答