2013-07-05 22 views
0

我的總體目標是讓指定的動物(貓1)發出聲音(警告框)並獲取另一個特定的動物(狗1)來傾聽貓發出的聲音用他的聲音回覆。JavaScript回調和範圍(參考正確的東西)

在下面的代碼中,我嘗試使用bind命令來實現我的回調。

Ext.define('Animal', 
    { 
     name: 'Unknown', 
     sound: 'Unknown', 
     listening: this.listening, 
     constructor: function(name) 
     { 
      if (name) 
      { 
       this.name = name; 
      } 
     }, 
     makeSound: function() 
     { 
      alert(this.name + " says " + this.sound); 
      if(this.listening) 
      { 
       this.listening(); 
      } 
     }, 
     isListening: function(listening) 
     { 
      this.listening = listening; 
     } 
    }); 

Ext.define('Cats', 
    { 
     extend: 'Animal', 
     name: 'Unknown', 
     sound: 'Meow', 
     listening: this.listening, 
     listen: function() 
     { 
      if(this.listening) 
       alert(this.name + "is listening."); 
     } 
    }); 
Ext.define('Dogs', 
    { 
     extend: 'Animal', 
     name: 'Unknown', 
     sound: 'Woof', 
     listening: this.listening, 
     listen: function() 
     { 
      if(this.listening) 
       alert(this.name + "is listening."); 
     } 
    }); 
var cat1 = Ext.create('Cats', 'Domino'); 
var cat2 = Ext.create('Cats', 'Tiger'); 
var dog1 = Ext.create('Dogs', 'Bruno'); 
var dog2 = Ext.create('Dogs', 'Spot'); 

dog1.listen = dog1.listen.bind(dog1); //failed miserably, not sure of the proper usage, 
cat1.isListening(dog1.listen);  //I saw an example using this format. 
cat1.makeSound(); 
cat2.makeSound(); 
dog1.makeSound(); 
dog2.makeSound(); 

當然,這並沒有爲我工作,但它可能是作爲bind命令的不正確使用簡單(在控制檯中沒有錯誤做出有時要告訴) 的方式我真的想實現這一目標如下:(下面代碼中的註釋說明它非常好)

Ext.define('Animal', 
    { 
     name: 'Unknown', 
     sound: 'Unknown', 
     listening: this.listening, 
     constructor: function(name) 
     { 
      if (name) 
      { 
       this.name = name; 
      } 
     }, 
     makeSound: function() 
     { 
      alert(this.name + " says " + this.sound); 
     }, 
     listen: function(obj) 
     { 
      if(this.listening) 
       alert(obj.name + " is listening to " + this.name + "."); 
     } 
    }); 

Ext.define('Cats', 
    { 
     extend: 'Animal', 
     name: 'Unknown', 
     sound: 'Meow', 
    }); 
Ext.define('Dogs', 
    { 
     extend: 'Animal', 
     name: 'Unknown', 
     sound: 'Woof', 
    }); 
var cat1 = Ext.create('Cats', 'Domino'); 
var cat2 = Ext.create('Cats', 'Tiger'); 
var dog1 = Ext.create('Dogs', 'Bruno'); 
var dog2 = Ext.create('Dogs', 'Spot'); 

//some callback that will wait for a specific animal to make a sound 
//and call the listen function in an intelligent way so I get this.name 
//to be the animal that made that sound and the obj.name to be the 
//animal that is listening 

cat1.makeSound(); 
cat2.makeSound(); 
dog1.makeSound(); 
dog2.makeSound(); 

這需要我的使用權範圍,當然我不知道如何處理。 主要我希望在這方面有所幫助,同時遠離自定義事件回調。 任何幫助表示讚賞。

回答

0

不要試圖重新發明輪子,而是使用事件。 Ext.util.Observable爲你做了所有這些工作。

+0

是的,我最終使用Observable類來處理它。謝謝。 – FailedFace