2017-03-22 13 views
0

私はSignalRを試しています。クライアントが定義したコールバックがjavascriptオブジェクトに属するメソッドであるとき、その関数の中で(SignalRから呼び出されたとき) 'this'はハブオブジェクトを参照します。私の質問は、コンテナのJavaScriptオブジェクトを取得して、変数と関数にアクセスできるようにする方法です。SignalRクライアントサイドコールバックはオブジェクト関数であり、 'this'

var gameLoad = { 

    init: function() { 
     // create the network object and hook it's functions update for loading 
     this.network = $.connection.testHub; 
     console.log(this.network); 
     this.network.client.hello = this.sayHello; 
    }, 

    // called from signalR 'this' is the network hub object now when inside the function 
    sayHello: function() { 
     console.log("Test 2!"); 
     console.log(this); // <-- this isn't gameLoad object it's SignalR object. how do I access gameLoad object properties/methods? 

     play.update(); 
    }, 

    create: function() { 
     var self = this; 
     console.log(this.network); 

     // switch to play state passing network along so it can bind to some of it's function 
     $.connection.hub.start().done(function() { 
      console.log("Started!") 
      console.log("Calling server function."); 

      // make our first network call 
      self.network.server.hello(); 
     }); 
    } 
}; 

答えて

1

あなたはgameload変数経由でオブジェクトにアクセスできるようにするには、オブジェクトを作成し、gameloadという変数に格納している:

var gameLoad = { 
    foo: "foo", 
    bar: function() { 
     console.log(gameLoad.foo); 
    } 
}; 

gameLoad.bar(); 

https://jsfiddle.net/nk4hv96c/

EDIT:

あなたはJavaScriptを具体的に求めているので、この次の提案は答えとはみなされませんが、JavaScriptを書くときにはTypeScriptを使用します。

TypeScriptは、コードをより構造化し、 "this"を "操作中のオブジェクト"として保存できるような便利な機能を提供します。

https://basarat.gitbooks.io/typescript/docs/classes.html

https://basarat.gitbooks.io/typescript/docs/arrow-functions.html

EDIT 2:あなたはコンストラクタ関数を使用したい場合、あなたは "この" コンストラクタ関数内の変数に保存することができます

function Foo() { 
    var self = this; 

    this.Bar = "Bar"; 

    this.Baz = function() { 
     console.log(self.Bar); 
    }; 
} 

var foo = new Foo(); 
foo.Baz(); 

https://jsfiddle.net/8b7kjmau/

これは活字体がそれをどのように処理するかもある:http://www.typescriptlang.org/play/#src=class%20Foo%20%7B%0D%0A%20%20%20%20public%20Bar%20%3D%20%22Bar%22%3B%0D%0A%0D%0A%20%20%20%20public%20Baz%20%3D%20()%20%3D%3E%20%7B%0D%0A%20%20%20%20%20%20%20%20console.log(this.Bar)%3B%0D%0A%20%20%20%20%7D%3B%20%20%20%20%0D%0A%7D

EDIT 3:

この例では、 "これは" 変更されているにもかかわらず、 "自己" は利用可能である方法を示しています。

「これ」を変更するために、SignalRではなくjQueryのクリックイベントを使用します。

function Foo() { 
    var self = this; 

    this.Bar = "Bar"; 

    this.Baz = function() { 
     console.log(this.self); 
     console.log(this.id); 
     console.log(self.Bar); 
    }; 
} 

var foo = new Foo(); 

$("#button").click(foo.Baz); 

https://jsfiddle.net/gr7dzgqr/

出力:

Undefined 
button 
Bar 
+0

ええ、私は、オブジェクト名自体を経由して、それが動作します。この場合には、それをアクセスすることができましたけど、私が作成したクラスと新しいを使用した場合にどのようなオブジェクト?私はこれを試してみます、そして、私がこれを書いたことが答えです。 – user441521

+0

その編集が好奇心を満たしてくれることを願っています! – AndyJ

+0

新しいES6はJavascriptで "クラス"を与えるようです(Typescriptを使う必要はありません)。そこでは、私はvar self =このアイデアを関数の外で行うことができるようには見えません。私はコンストラクタ内でthis.self = thisを実行できますが、singalRコールバックの内部でこれがもうそのクラスを参照していない場合には役に立ちません。 – user441521

関連する問題