2011-11-03 51 views
9

的特點是什麼MooTools的每一個MooTools的開發者需要知道的隱藏的或不明顯的特性?每回答隱藏MooTools的

一個特點,請。

+7

這應該是一個社區維基 –

+0

我同意。我不知道該怎麼做。 – artlung

+0

不幸的是,你需要10k + rep來做到這一點,我想。 –

回答

4

有很多功能,如果你讀的源代碼可以使用,雖然官方的說法是:if it's not in the documentation, it is not in the api and it's not supported so do not base your code around it as it may change

話雖這麼說,有幾件事情,真的是非常有用的。我最喜歡的無證特點是:

引用的元素都已經或者正在創建或通過選擇傳遞一個UID

任何元素,被分配的屬性uid,這是漸進的和獨特的。由於MooTools 1.4.2,這隻能通過Slick.uidOf(node)而不是通過舊元素attr .uid讀取。您現在可以使用任何MooTools元素對象的新uniqueNumber屬性。

這是如何使用?對於初學者來說,元素存儲。它依賴於uid作爲關閉中的Storage對象中的關鍵字,該關鍵字將包含任何對該元素具有.store'd的對象。

element.store('foo', 'bar'); 

翻譯爲:

Storage[Slick.uidOf(element)].foo = 'bar'; 

element.retrieve('foo'); // getter of the storage key 
element.eliminate('foo'); // delete Storage[Slick.uidOf(element)].foo 

初始化存儲爲您外部創建的元素,例如,通過var foo = document.createElement('div')而不是元素構造

Slick.uidOf(foo); // makes it compatible with Storage 

// same as: 
document.id(foo); 

釷被存儲在由框架入庫英格斯還包括所有events回調,validators情況下,Fx實例(吐溫,變形等)等。

你能做些什麼知道元素的UID?那麼,克隆元素不會獲取元素的存儲或事件。實際上,你可以寫一個新的Element.cloneWithStorage原型,也將複製所有存儲的值,你可能有,這是高達一點有用的 - 引用的特定元素(如,Fx.Tween)情況下,將繼續引用舊元素,所以它可能意想不到的結果。這對於移動自己的存儲非常有用,但是,您只需要一個類似的方法即可記錄您存儲的內容並允許您將其克隆。另一種元素的數據

事例存儲穿刺:

var foo = new Element('div'), 
    uid = foo.uniqueNumber; 

foo.store('foo', 'foo only'); 

var bar = new Element('div'); 

console.log(bar.retrieve('foo')); // null 

bar.uniqueNumber = uid; // force overwrite of uid to the other el 

console.log(bar.retrieve('foo')); // foo only - OH NOES 

console.log(Object.keys(foo)); // ["uniqueNumber"] - oh dear. enumerable! 
6

Function.prototype.protect也許是一個鮮爲人知不錯的。

是用於類擁有受保護的方法:

var Foo = new Class({ 

    fooify: function(){ 
     console.log('can\'t touch me'); 
    }.protect(), 

    barify: function(){ 
     this.fooify(); 
    } 

}); 

var foo = new Foo(); 
foo.fooify(); // throws error 
foo.barify(); // logs "can't touch me" 

我個人不經常使用它,但它可能在某些情況下是有用的。

9

類增變

MooTools有一個奇妙的功能,使您可以創建自己的類存取器。例如,添加一個記錄器的被引用特定類的方法,你可以這樣做:

// define the mutator as 'Monitor', use as Mointor: ['methodname', 'method2'...] 
Class.Mutators.Monitor = function(methods){ 
    if (!this.prototype.initialize) this.implement('initialize', function(){}); 
    return Array.from(methods).concat(this.prototype.Monitor || []); 
}; 

Class.Mutators.initialize = function(initialize){ 
    return function(){ 
     Array.from(this.Monitor).each(function(name){ 
      var original = this[name]; 
      if (original) this[name] = function() { 
       console.log("[LOG] " + name, "[SCOPE]:", this, "[ARGS]", arguments); 
       original.apply(this, arguments); 
      } 
     }, this); 
     return initialize.apply(this, arguments); 
    }; 
}; 

,然後在類:

var foo = new Class({ 

    Monitor: 'bar', 

    initialize: function() { 
     this.bar("mootools"); 
    }, 

    bar: function(what) { 
     alert(what); 
    } 

}); 

var f = new foo(); 
f.bar.call({hi:"there from a custom scope"}, "scope 2"); 

嘗試的jsfiddle:http://jsfiddle.net/BMsZ7/2/

這個小寶石有對於我在一個HUUUGE異步web應用程序中捕捉嵌套的bugfoot競爭條件問題有幫助,否則這很難追蹤。

3

我最喜歡的功能,後來我才知道,但我希望從一開始就知道作者 - 事件假點,尤其是:once

http://mootools.net/docs/more/Class/Events.Pseudos#Pseudos:once

+2

你可以自由回答任何問題,無論它多大,特別是沒有被接受的答案。每個問題都有其訪問者,並可能有助於某人。 – Wh1T3h4Ck5

+1

的確是@jdwire,沒有限制。當你和我做得更好時,StackOverflow會變得更好。 – artlung

+0

好的。多謝你們。剛加入,所以試圖學習我的方式。 –