2016-05-16 12 views
0

ここで参照されるフィドルとコードは、実際には機能しません。私は、1つのファイルプロジェクトで定義されたコントローラを取得する方法を知らない。いずれにせよ、私の問題は、私がコントローラ機能(私の場合には後で)にいるときです。私はtestvalへの参照を取得する方法を把握することはできません。別の起動で単に19〜32行の単純な例を作成すると、それは動作します(fiddle:https://fiddle.sencha.com/#fiddle/1ae7を参照)。ExtJS 6コントローラーのスコープをajax.requestに渡す方法

しかし、私のコントローラのケースでは、私の成功または失敗のイベントでtestvalを取得していません。私の関数の文脈(スコープ)で渡す方法私はAjaxリクエストを呼び出していますか?

https://fiddle.sencha.com/#fiddle/1ae9

Ext.define('mycontroller', { 
    extend: 'Ext.app.Controller', 
    alias: 'controller.main', 
    myfun: function() { 
     console.log('controller:myfun'); 
    } 
}); 



var mypanel = Ext.create('Ext.panel.Panel', { 
    controller: { 
     type: 'main' 
    }, 
    listeners: { 
     afterrender: function() { 
      console.log('afterrender'); 

      var testval = "hi there"; 

      Ext.Ajax.request({ 
       method: 'POST', 
       url: '/dummy', 
       jsonData: 'jsonData', 
       scope: this, 
       success: function() { 
        // this never gets called, just testing scope 
       }, 
       failure: function() { 
        // testval IS NOT IN SCOPE, CONFUSED ABOUT SCOPE AND THIS HERE 
        Ext.Msg.alert('info', testval); 
       } 
      }); 
     } 
    }, 
    html: 'test panel' 
}); 


Ext.application({ 
    name: 'Fiddle', 

    launch: function() { 
     Ext.create('Ext.container.Viewport', { 
      layout: 'fit', 
      items: [mypanel] 
     }); 

    } 
}); 
+0

あなたがしようとしていることは明らかではありません。あなたの例のように、 'afterrender'の中で定義されたローカル変数' testval'にアクセスするだけですか?そして、それはうまくいくはずです。コントローラーはあなたの例ではどこにも使われていません。 'afterrender'はビューに属していて、関数内のローカルスコープ変数にアクセスしています。リスナーをコントローラーに移動する場合は、リスナーを 'listener:{afterrender:" controller_function "}'として定義し、コントローラー・ファイルに関数を移動する必要があります。 – serg

+0

@serg私の問題は、testvalがExt.Ajax.requestの失敗の戻りの中で未定義であるということです。私の例(フィドル)では、私はちょうど呼び出され、フィドルでそれをワイヤリングする方法を理解していないようにすることを試みています(実際の問​​題をデモしようとしていますが、実際の問題ではありません) –

+0

実際のコード構造この例とは異なっていますが、たとえそれがフィドルの内部で動作しなくても、それを見ることは役に立ちます。 – serg

答えて

1

あなたはスコープを見つけるために、基本的なJS構造で考える必要があります。基本的な構造は関数Ext.Ajax.request()で、この場合は1つの(!)パラメータをとります。

この単一のパラメータはオブジェクトです。 オブジェクト内にthisを使用している場合、thisはそのオブジェクトを参照します。煎茶が使用するパターンは、前記


var me = this; 
Ext.Ajax.request({ 
    ... 
    scope: me, 
    ... 
}); 
var testvarは、任意のオブジェクトにスコープされていないローカル変数であるであろう関数に外側の範囲を転送する - それは機能ブロックを範囲とします。 I have made a working fiddle for you by just fixing the error I found in browser console、言っ

 var testval = "hi there"; 

     Ext.Ajax.request({ 
      failure: function() { 
       // testval IS ALWAYS "IN SCOPE" HERE, NO MATTER WHAT YOU SET scope TO, 
       // BECAUSE IT IS DEFINED INSIDE THE SAME FUNCTION BLOCK 
       Ext.Msg.alert('info', testval); 
      } 
     }); 

関連する問題