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

Module 围绕YUI的不同实例共享变量,module,yui3,instances,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("ut

我已将自定义模块制作为:

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 getVal = function(e){
            alert(MV.val);
        }
       Y.on("click", getVal,"#two");
    });
但这似乎不起作用。有没有一种方法可以让这种行为。我这样做只是为了分割代码。

问题是YUI()在每次执行时都会创建一个新的沙盒。如果您想重用它,您需要在第一次“使用”执行后捕获它的值,并在以后重用该值。也许有更好的YUish方法可以做到这一点,但我使用全局Yuiu_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");
});
问题是YUI()在每次执行时都会创建一个新的沙盒。如果您想重用它,您需要在第一次“使用”执行后捕获它的值,并在以后重用该值。也许有更好的YUish方法可以做到这一点,但我使用全局Yuiu_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");
});

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

// 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>
//util.js
YUI.add('util',函数(Y){
var NS=Y.namespace('com.MyCompany');
NS.val=null;
}“版本”{
需要:['some','dependencies']
});
//1.js
YUI.add('1',函数(Y){
var NS=Y.namespace('com.MyCompany');
Y.on('click',函数(e){NS.val=23;},'one');
}“版本”{
需要:['util']
});
//2.js
YUI.add('2',函数(Y){
var NS=Y.namespace('com.MyCompany');
Y.on('click',函数(e){alert(NS.val)},'two');
}“版本”{
需要:['util']
});
//index.html
设置值
获取值
YUI.use('one',two','node','event',function(Y){
//这里的主要应用程序逻辑
});
这允许您将代码分解为共享同一YUI沙盒实例的单独模块


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

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

// 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>
//util.js
YUI.add('util',函数(Y){
var NS=Y.namespace('com.MyCompany');
NS.val=null;
}“版本”{
需要:['some','dependencies']
});
//1.js
YUI.add('1',函数(Y){
var NS=Y.namespace('com.MyCompany');
Y.on('click',函数(e){NS.val=23;},'one');
}“版本”{
需要:['util']
});
//2.js
YUI.add('2',函数(Y){
var NS=Y.namespace('com.MyCompany');
Y.on('click',函数(e){alert(NS.val)},'two');
}“版本”{
需要:['util']
});
//index.html
设置值
获取值
YUI.use('one',two','node','event',function(Y){
//这里的主要应用程序逻辑
});
这允许您将代码分解为共享同一YUI沙盒实例的单独模块


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

您需要单独的沙盒,还是这样做只是为了分割代码?只是为了分割代码。您需要单独的沙盒,还是这样做只是为了分割代码?只是为了分割代码。您还可以共享某些数据(或通信)YUI实例与Y之间。全局查看:您还可以在YUI实例与Y之间共享某些数据(或通信)。全局查看: