1

我将自定义模块组成为:

YUI.add('util', function(Y) {
   Y.namespace('com.myCompany');
   var NS = Y.com.myCompany;
        NS.val = undefined;
}, '3.3.0', {
   requires : []
});

我想要做的是在我使用这个模块“util”的实例中共享这个变量 val。如在

YUI().use("util","node","event",function (Y) {
    Y.namespace('com.myCompany');
    var MV = Y.com.myCompany;
    var setVal = function(e){
        MV.val = 10;
}
   Y.on("click", setVal,"#one");
  });

现在,如果我想在其他情况下得到它,我正在执行以下操作:

 YUI().use("util","node","event",function (Y) {
        Y.namespace('com.myCompany');
        var MV = Y.com.myCompany;
        var getVal = function(e){
            alert(MV.val);
        }
       Y.on("click", getVal,"#two");
    });

但这似乎不起作用。有没有办法得到这种行为。我这样做只是为了拆分代码。

4

2 回答 2

3

在这种情况下,您应该只创建一个沙箱。分解代码的正确方法是使用YUI.add创建模块并指定它们的依赖项。一种方法是按如下方式构建代码:

// util.js
YUI.add('util', function (Y) {
    var NS = Y.namespace('com.MyCompany'); 
    NS.val = null;
}, 'version', {
    requires: ['some', 'dependencies']
});

// one.js
YUI.add('one', function (Y) {
    var NS = Y.namespace('com.MyCompany');
    Y.on('click', function (e) { NS.val = 23; }, '#one');
}, 'version', {
    requires: ['util']
});

// two.js
YUI.add('two', function (Y) {
    var NS = Y.namespace('com.MyCompany');
    Y.on('click', function (e) { alert(NS.val); }, '#two');
}, 'version', {
    requires: ['util']
});

// index.html
<button id="one">Set the value</button>
<button id="two">Get the value</button>

<script>
    YUI.use('one, 'two', 'node', 'event', function (Y) {
        // main application logic here
    });
</script>

这允许您将代码分解为共享相同 YUI 沙箱实例的单独模块。

注意还YUI.namespace返回有问题的命名空间,因此您不需要额外的变量。

于 2011-07-29T18:42:05.407 回答
2

问题是 YUI() 每次执行都会创建一个新的沙箱。如果要重用它,则需要在第一次“使用”执行后捕获它的值,然后再重用该值。可能有更好的 YUish 方法来做到这一点,但我使用全局 YUI_MAIN:

var YUI_MAIN = YUI().use("util","node","event",function (Y) {
  Y.namespace('com.myCompany');
  var MV = Y.com.myCompany;
  var setVal = function(e){
    MV.val = 10;
  };
  Y.on("click", setVal,"#one");
});

YUI_MAIN.use(function (Y) {
  Y.namespace('com.myCompany');
  var MV = Y.com.myCompany;
  var getVal = function(e){
    alert(MV.val);
  };
  Y.on("click", getVal,"#two");
});

如果您真的想在单独的沙箱之间共享并避免额外的全局,您可以使用闭包创建一个私有变量,如下所示:

YUI.add('util', (function () {
  var privateUtilNS = {};
  return function(Y) {
    privateUtilNS['val'] = undefined;
    Y.setVal = function(e){
      privateUtilNS.val = 10;
    };
    Y.getVal = function(e){
      alert(privateUtilNS.val);
    };
  };
  }()), '3.3.0', {
    requires : []
});

YUI().use("util","node","event",function (Y) {
  Y.on("click", Y.setVal,"#one");
});

YUI().use("util","node","event",function (Y) {
  Y.on("click", Y.getVal,"#two");
});
于 2011-07-19T19:12:43.020 回答