Конфликт версий YUI в портлете - PullRequest
3 голосов
/ 11 октября 2011

Я загружаю файл версии yui.js 3.3.0 из портлета, но LifeRay использует файл yui.js 3.2.0, поэтому всякий раз, когда я загружаю эту страницу, ошибки появляются как

G_ENV._loaded [VERSION] не определено - эта ошибка появляется в yui.js, который использует liferay, использующий версию 3.2.0.

, поэтому его заменяющее значение, например, G_ENV._loaded [3.2.0], и которое выдаетошибка, потому что мы загрузили версию 3.3.0 из портлета.

Я заменил файл версии yui.js 3.2.0 в портлете, но он выдавал некоторые другие ошибки js.

Как это будет работать в3.2.0 или есть ли способ обновить существующую версию yui?

Это код yui.js, в этой строке выдается ошибка

                      if (!G_ENV._loaded[VERSION][name]) {
                            missing.push(name);
                        } else {
                            used[name] = true; // probably css
                        }

Будет полезна любая помощь,кто-нибудь сталкивался с такой проблемой.

Спасибо

Ответы [ 2 ]

3 голосов
/ 28 июля 2012

На самом деле, проблема не в том, что Alloy помещается на объект YUI.Это было бы довольно просто обойти, просто выполнив: YUI.AUI = AUI после загрузки нового YUI.

Проблема в том, что везде Alloy (и даже модули YUI, уже загруженные на страницу) ссылаются на YUI, этоожидает, что это будет конкретная версия YUI.

Во многих случаях это не так уж и сложно, поскольку API между выпусками YUI не так уж и далек.Однако между 3.2 и 3.3 произошли некоторые изменения в виджете, а также другие общие изменения, которые могут вызвать проблемы.

Проблема в том, что в настоящее время в YUI нет приемлемого способа загрузки нескольких версий библиотеки.на страницу, которая не вызовет какой-либо конфликт.(Поскольку глобальный get YUI перезаписан, а также его свойства, такие как YUI.Env).

Тем не менее, я подбирал идею одного из возможных способов справиться с этим, используя динамически сгенерированные iframes для загрузкиотдельный экземпляр YUI в другом окне и передайте его на исходную страницу).

Если я смогу заставить это работать, это будет кое-что, что мы будем делать бэкпорт ко всем версиям Alloy, чтобы пользователи Liferay могли использоватьэто также.

Джош, если у тебя есть какие-нибудь мысли о том, как лучше справиться с этим, я бы определенно был всем вниманием.

Спасибо,

3 голосов
/ 12 января 2012

Обновление, изменение или перезапись собственной установки YUI в Liferay чрезвычайно сложна по двум причинам. Во-первых, среда пользовательского интерфейса Liferay 6.0 (Alloy) работает на YUI 3.2.0. Во-вторых, собственный шаблон портала создает экземпляр пользовательского интерфейса сплава для глобального объекта YUI (YUI.AUI), что ужасно, так как делает структуру YUI тесно связанной с ужасно реализованным AUI . Ваш браузер вызывает эту ссылку AUI для объекта YUI при загрузке страницы и после события window.onload. Если вы попытаетесь заменить или изменить глобальный объект YUI, он испортит Alloy, на котором работает пользовательский интерфейс Liferay.

Поскольку об обновлении не может быть и речи, следующая лучшая альтернатива - ввести только новые модули YUI, которые вы хотите использовать. Кроме того, вы можете попробовать Liferay 6.1 CE, который имеет встроенный 3.4.1, но похоже, что он все еще находится в бета-тестировании.

Вот пример ввода и использования модуля dom-core из YUI 3.4.1 и его использования в Liferay 6, который работает на YUI 3.2.0. Я получил представление из документации YUI о том, как объединить модули YUI 2 в 3 (http://yuilibrary.com/yui/docs/yui/yui-loader-ext.html). Чтобы быстро выяснить зависимости каждого модуля, вы можете использовать онлайн-конфигуратор YUI http://yuilibrary.com/yui/configurator/.

var config = {
ignore : ["skin-sam-overlay","skin-sam-widget","skin-sam-widget-stack","skin-sam-tabview"],
groups: {
    yui341: {
        base: '/js/yui-3.4.1/build/',
        modules:  {
            yui341_yui_base: {
                path: 'yui-base/yui-base.js'
            },
            yui341_oop: {
                path: 'oop/oop.js',
                requires: ['yui341_yui_base']
            },
            yui341_features: {
                path: 'features/features.js',
                requires: ['yui341_yui_base']
            },
            yui341_dom_core: {
                path: 'dom-core/dom-core.js',
                requires: ['yui341_yui_base','yui341_oop','yui341_features']
            }
        }
    }
}
};

YUI(config).use('yui341_dom_core',function(Y){
    //YUI 3.4.1 config modules are now accessable through 'use' call
    console.log(Y.version);  //say hello to the newer version (3.4.1)
    Y.use('dom-core',function(Y){
        //Finally have access to native 3.4.1 module
        console.log(Y.DOM);
    });
});
...