2013-10-09 31 views
3

在YUI3中可以覆蓋例如Node模塊?例如,我想要做這樣的事情:你可以使用YUI模塊的monkey-patch方法嗎?

Y.Node.prototype.get = function() { 
    // Do some stuff then call the original function 
}; 

完美的作品(如你所期望的),當Y是YUI,我推測是由庫創建的全局可用的實例。當您使用模塊加載它不工作,並通過回調:

YUI().use("*", function (DifferentY) { 
    DifferentY.Node.prototype.get === Y.Node.prototype.get; // false 
}); 

我已經花了,同時通過YUI源挖掘,但到目前爲止還沒有制定出在哪裏以及如何​​在前面的例子是創建(並通過擴展,創建DifferentY.Node)。

我以前從未使用過YUI,所以可能是我以完全錯誤的方式去解決這個問題。

回答

5

好的如果我看一下這個例子,似乎有一個關於Y的誤解。在YUI中,每個東西都是沙盒,因此可以同時運行多個YUI實例。 Y不是全局變量,它將在您調用YUI()。use方法時實例化,並且只存在於該函數內。這就是爲什麼在這麼僅DifferentY存在的代碼,但沒有Y.

YUI().use('node', 'event', function (Y) { 
    // The Node and Event modules are loaded and ready to use. 
    // Y exists in here... 
}); 

所以,如果你想提高YUI「從外面」我將建立在YUI的模塊戰略,並創建一個YUI.add YUI模塊( )

if (YUI) { 
    YUI.add('node-enhancement', function (Y) { 
    Y.Node.prototype.get = function() { 
     // Do some stuff then call the original function 
    }; 
    }, '0.0.1', { 
    requires: [Node] 
    }); 
} 

,並讓開發加載增強作爲一個模塊(他將如何與YUI3了全球YUI對象是如何工作的解釋也無妨)

YUI().use('node-enhancement'), function(Y) { 
    // just use YUI as allways 
}); 

,本概述可能HEL p:http://yuilibrary.com/yui/docs/yui/

+0

謝謝,這肯定是有道理的。令我困惑的是,'use'回調之外的'YUI'實例顯然是可用的:http://jsfiddle.net/whMhq/ –

+0

@JamesAllardice YUI對象是全局的(它既是一個對象又是一個函數),但將YUI的每個實例分配給傳遞給作爲.use語句的最後一個參數的函數的Y變量。 Y實例僅分配給您在.use調用中指定的模塊。 – PottyBert

+0

@Kris - 在我連接到的小提琴中有一個全局可用的「Y」對象,它似乎是'YUI'的一個實例。如果你打算使用'use'調用,那麼它來自哪裏,它有什麼意義? –

0

以下是猴子修補技術的使用示例。

退房這裏的控制檯輸出:http://jsfiddle.net/jslayer/XmF6L/

YUI.add('node-custom-module', function(Y){ 
    console.warn('Override Y.Node'); 

    Y.Node.YOUR_NODE = 'custom Node'; 
}); 

YUI.add('widget-custom-module', function(Y){ 
    console.warn('Override Y.Widget'); 

    Y.Widget.YOUR_WIDGET = 'custom Widget'; 
}); 

YUI.GlobalConfig = { 
    modules : { 
     'node-custom-module' : { 
      condition : { 
       name : 'node-custom-module', 
       trigger : 'node', 
       test : function(){ 
        return true; 
       } 
      } 
     }, 
     'widget-custom-module' : { 
      condition : { 
       name : 'widget-custom-module', 
       trigger : 'widget', 
       test : function(){ 
        return true; 
       } 
      } 
     } 
    } 
}; 

YUI().use('node', function(Y) { 
    console.group('Node'); 
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE); 
    console.groupEnd('Node'); 
}); 

YUI().use('widget', function(Y) { 
    console.group('Widget'); 
    console.log('Y.Node.YOUR_NODE : ', Y.Node.YOUR_NODE); 
    console.log('Y.Widget.YOUR_WIDGET : ', Y.Widget.YOUR_WIDGET); 
    console.groupEnd('Widget'); 
}); 

當然,它是沒有必要使用YUI.GlobalConfig

而且,舒適的使用groupshttp://yuilibrary.com/yui/docs/yui/loader.html)內YUI配置的

groups : { 
    patches : { 
    modules : { 
     /* Define your mp modules here */ 
    } 
    } 
} 
相關問題