3

(クライアント側) socket.io をプロトタイプ クラスにラップしました。

Chat.Client = Class.create();

Chat.Client.prototype = {

    initialize: function() {
        ...
        this.socket.on('message', this.on_message);
        ...
    },

    on_message: function(data) {
        this.add_chat_message(data.something);
    }

    do_something: function(something) {
        ...
    }

on_message の「this」が「SocketNamespace」になるため、これは機能しません。従来は、「this」をコールバックに追加パラメーターとして渡すだけでこれを回避していましたが、socket.io を使用しているため、単純にこれを行うことはできません。

どうすればこれを解決できますか?

4

1 に答える 1

10

別の関数でラップできます。

initialize: function() {
  // ...
  var client = this;
  this.socket.on('message', function(data) { client.on_message(data); });

Function新しいブラウザー (または Node.js) では、代わりに"bind" と呼ばれるプロトタイプの関数を使用できます。

  this.socket.on('message', this.on_message.bind(this));

「bind」関数は、呼び出されると、元の関数 (「on_message」) が指定された値で強制的に呼び出される関数を返しthisます。

于 2012-04-13T13:32:58.673 に答える