0

私の全体的な目標は、指定された動物(cat1)に音を出させ(アラートボックス)、別の特定の動物(dog1)に猫の音を聞いてもらい、音で応答させることです。

次のコードでは、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();

これには、適切なスコープを使用する必要がありますが、もちろん、どのように処理すればよいかわかりません。主に、コールバックのカスタム イベントから離れている間、この分野での助けを期待していました。どんな助けでも大歓迎です。

4

1 に答える 1

0

車輪の再発明を試みるのではなく、代わりにイベントを使用してください。Ext.util.Observable は、それ以上のことをすべて行います。

于 2013-07-10T23:03:47.787 に答える