4

Sencha touch の基本概念を理解するために、このオンライン チュートリアルを実行しました。これで、私の知識で実際のプロジェクトのコーディングを開始できることを楽しみにできると確信しています。

this.callParent(arguments)しかし、著者がチュートリアルで使用する の機能について質問があります。

名前が「これの親クラスが呼び出されている」ことを明確に示していることは知っています。
しかし、次のような質問があります: (チュートリアルに関連)

  • 親クラスを呼び出す理由
  • これにより、親クラスが再び完全に実行されますか?

callParent上記のチュートリアルに関連することを理解するのを手伝ってください。

理解できないタッチドキュメントを調べました。(著者のコードに関しては、説明がまったく異なるようです)。

プロジェクトのダウンロード リンク

4

1 に答える 1

19

あなたの質問で述べたようthis.callParent(arguments)に、スーパークラスで適切な関数を呼び出します。

つまりthis.callParent(arguments)、コンストラクターで呼び出すと、拡張されているスーパークラスのコンストラクターが呼び出されます。

あなたが言及したチュートリアルでは、これは著者が行っていることです。

launch: function () {
  //This line simply calls the super class(Ext.app.Controller) launch function  
  this.callParent(arguments);
  var notesStore = Ext.getStore("Notes");
  notesStore.load();
  console.log("launch");
},

 init: function () {
  // This line simply calls the super class(Ext.app.Controller) init function   
  this.callParent(arguments); 
  console.log("init");
 }

しかし、なぜ彼がこれを行うのか、そのチュートリアルではExt.app.Controllerクラスinitと関数を呼び出す必要がないため、私にはわかりません。launch

例を挙げて説明しましょう

1) と呼ばれるスーパークラスの作成Main

Ext.define('MyApp.controller.Main', {
    extend: 'Ext.app.Controller',

    launch: function () {
       console.log("Main launch");
    },      

    init: function () {
       console.log("Main init");
    },    

    config: {

    } 
});

SubMain2)拡張するサブクラスを作成するMyApp.controller.Main

Ext.define('MyApp.controller.SubMain', {
    extend: 'MyApp.controller.Main',

    launch: function () {
        this.callParent(arguments);
       console.log("launch");
    },

     init: function () {
        this.callParent(arguments);
       console.log("init");
     },

    config: {
    }
});

アプリケーションを実行すると、スーパー クラスとサブクラスの両方に配置した console.log がブラウザ コンソールに次のように出力されます。

出力

Main init 
Main init 
SubMain init 
Main launch 
Main launch
SubMain launch 

私たちが知っているように、アプリケーションを起動するinitlaunch、すべてのコントローラーの機能が一度呼び出されます。

しかし、Main init と Main launch 関数が 2 回呼び出されているのがわかります。

再びスーパークラスのinitとlaunch関数と呼ぶ理由は、 (スーパークラス)クラスのinitとlaunch関数をもう一度呼び出すという関数のthis.callParent(arguments);中に入れたからです。init and launchSubMainMain

もっとあります,関数argumentsに渡されたものは何ですかcallParent

引数は特別なパラメータです。

それでは、テストする例を見てみましょう

Ext.define('Mail.controller.Messages', {
    extend: 'Ext.app.Controller',

    config: {
        refs: {
            viewer: 'messageviewer',
            messageList: 'messagelist'
        },
        control: {
            messageList: {
                itemtap: 'loadMessage'
            }
        }
    },

    loadMessage: function(item) {
        this.getViewer().load(item);
    }
});

Mail.controller.phone.Messagesclass extends Mail.controller.Messages、これは単にすべての構成と機能が継承されることを意味します。

 Ext.define('Mail.controller.phone.Messages', {
    extend: 'Mail.controller.Messages',

    config: {
        refs: {
            main: '#mainPanel'
        }
    },

    loadMessage: function(item) {
        // Without this line loadMessage function of super class will not be invoked
        this.callParent(arguments);
        this.getMain().setActiveItem(1);
    }
});

messageListこれで、ユーザーがクラス内のloadMessage関数内のアイテムにタブを付けると、Mail.controller.phone.Messages呼び出されます。

また、関数に配置this.callParent(arguments);したloadMessageため、ファーストMail.controller.MessagesクラスloadMessage関数が呼び出されてからthis.getMain().setActiveItem(1);行が実行されます。

前述のようにloadMessage、関数 inは、関数 atクラスにMail.controller.Messages配置するまで呼び出されません。this.callParent(arguments);loadMessageMail.controller.phone.Messages

引数は関数 ofitemにのみ渡されますが、関数 of は引き続き引数を取得することに注意してください。loadMessageMail.controller.phone.MessagesloadMessageMail.controller.phone.Messagesitem

クラスの関数内で関数argumentsを渡したからです。this.callParentloadMessageMail.controller.phone.Messages

于 2013-08-01T20:00:55.543 に答える