围绕YUI的不同实例共享变量

时间:2011-07-19 05:59:28

标签: module yui3 instances

我已将自定义模块编组为:

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");
    });

但这似乎不起作用。有没有办法来解决这个问题。我这样做只是为了分割代码。

2 个答案:

答案 0 :(得分: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返回有问题的命名空间,因此您不需要额外的变量。

答案 1 :(得分: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");
});