Portlet中的YUI版本冲突问题

时间:2011-10-11 12:47:33

标签: javascript yui liferay portlet

我正在从portlet加载yui.js 3.3.0版本文件但是使用3.2.0 yui.js文件生活, 所以每当我加载那个页面时,js就会出现错误

G_ENV._loaded [VERSION]未定义 - 此错误发生在yui.js中,使用的是liferay 3.2.0版本。

所以它的替换值如G_ENV._loaded [3.2.0]并且会抛出一个错误becoz我们从portlet加载了3.3.0版本。

我在portlet中替换了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 个答案:

答案 0 :(得分:3)

由于两个原因,升级,更改或覆盖Liferay中的本机YUI安装非常困难。一,Liferay 6.0的UI框架(Alloy)在YUI 3.2.0上运行。二,本机门户模板将合金ui实例化到全局YUI对象(YUI.AUI)上,这很糟糕,因为它使YUI框架与可怕的实现AUI 紧密耦合。您的浏览器在YUI对象上调用此AUI引用,因为页面正在加载并且在window.onload事件之后。如果你试图替换或修改全局YUI对象,它会搞掉Liferay的UI运行的Alloy。

由于升级是不可能的,下一个最佳选择是引入您想要使用的新YUI模块。另外,您可以试用内置3.4.1的Liferay 6.1 CE,但看起来它还处于测试阶段。

这是一个从YUI 3.4.1引入和使用dom-core模块并在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);
    });
});

答案 1 :(得分:3)

实际上,问题不在于合金被推到YUI对象上。只需简单地做以下事情就可以解决这个问题: 加载新YUI后YUI.AUI = AUI

问题是因为所有Alloy(甚至YUI模块已经加载到页面上)都引用了YUI,它希望它是YUI的特定版本。

在许多情况下,这并不是什么大不了的事,因为YUI版本之间的API并不是那么遥远。但是,在3.2和3.3之间,Widget有一些变化,以及可能导致问题的其他一般变化。

问题是YUI目前没有可接受的方法将多个版本的库加载到不会引起某种冲突的页面上。 (因为YUI全局被覆盖,以及它的属性,例如YUI.Env)。

但是,我一直在寻找一种可能的方法来处理这个问题,使用动态生成的iframe在不同的窗口中加载单独的YUI实例并将其传递到原始页面。)

如果我能够正常工作,那么我们将向所有版本的Alloy反向移植,以便Liferay用户也可以利用它。

乔希,如果你对更好的方法有任何想法,我绝对会全力以赴。

谢谢,