0

メンバー変数を永続化できるように、クラス インスタンスを渡そうとしています。次のコードがあります

var mainNamespace = WinJS.Namespace.define("MainNamespace", {        
    setupClass: WinJS.Class.define(
        function () { },
        {
            createSetup: function CreateSetup() {                
                var interactionInst = new mainNamespace.interaction();

                drawScreen.DrawScreen(interactionInst);
                var backgroundProc = new 
                        mainNamespace.createProc(interactionInst);                
        }
    ),
    interaction: WinJS.Class.define(
        function() {},
        {
            clickedPos: 0,
            handleTouch: function handleTouch(event) {
                this.clickedPos = event.x;
                console.log("New pos: " + this.clickedPos);
        }
    ),

    createProc: WinJS.Class.define(
        function (interaction) {
            setInterval(this.runProc, 1000, interaction);
    },
    {

        runProc: function runNewProc(interaction) {
            console.log(interaction.clickedPos);
        }        
       ...        

ネームスペースは次のdrawScreenとおりです。

WinJS.Namespace.define("drawScreen", {
    DrawScreen: WinJS.Class.define(
    function DrawScreen(interaction) {
        /// Do some screen set-up here

        canvas.addEventListener("MSPointerUp", interaction.handleTouch, false);
    }
)


});

私が抱えている問題は、interaction.clickedPos決して変わらないということです。なぜ変更されないのですか?これはJavaScriptアプリの正しい方法ですか?

編集:

なぜこれが起こっているのかはわかりましたが、修正方法はわかりませんでした。interaction.handleTouch起動すると、オブジェクトではなくオブジェクトthisを参照するため、そのメンバーにはアクセスできません。canvasinteraction

4

1 に答える 1

1

問題は次の行にあります。

canvas.addEventListener("MSPointerUp", interaction.handleTouch, false);

ここでは、現在のインスタンスへの接続 (相互作用) なしで関数 handleTouch() への参照を渡しています。.bind() メソッドを使用して、イベント ハンドラーのコンテキストを変更できます。

canvas.addEventListener("MSPointerUp", interaction.handleTouch.bind(interaction), false);

于 2013-03-05T15:31:53.363 に答える