Совместное использование переменных в разных экземплярах YUI - PullRequest
1 голос
/ 19 июля 2011

Я создал пользовательский модуль как:

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

Я пытаюсь поделиться этой переменной val в тех случаях, когда я использую этот модуль "util". Как в

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 ]

3 голосов
/ 29 июля 2011

В этом случае вы должны создать только одну песочницу.Правильный способ разбить ваш код - использовать 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 возвращает рассматриваемое пространство имен, поэтому вам не нужны дополнительные переменные.

2 голосов
/ 19 июля 2011

Проблема в том, что YUI () создает новую песочницу с каждым выполнением.Если вы хотите использовать его повторно, вам нужно захватить его значение после первого выполнения «use» и использовать это значение позже.Возможно, есть лучший способ сделать это с помощью 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");
});
...