ExtJs4组件中initComponent方法介绍以及为什么要使用this.callParent();

我们知道,Ext的UI组件有一个initCompent()方法。

这个方法定义在UI组件顶级类Component中,在Component的构造函数中会调用它进行组件初始化操作。

Component的子类都覆盖了initCompent方法,在不同的层级上做了不同的处理。举个例子,从Window一直

到Conponent,会形成这样一个调用链条。

从图中可以看到初始化当前组件的时候,要从最顶端组件开始初始化,每个组件都承担了构建最终组件的任务。

看到这里我们不禁发出疑问,怎么在调用当前组件的initComponent方法前还去调用下父类的呢?

学过java的同学都知道,java如果想在当前方法调用父类的同名方法,可以super.方法名();

首先介绍下Ext3是怎么处理的

MyClass1 = function(){}
MyClass1.prototype={
		say:function(){
			console.log('hello1');
		}
}
MyClass2 = Ext.extend(MyClass1,{
	say:function(){
		MyClass2.superclass.say.call(this);
		console.log('hello2');
	}
});
//每次子类需要调用超类方法,都要像下面这样写:
MyClass2.superclass.say.call(this);

这种写法有几个弊端:

  1. 类名要内置到函数代码模块中,如果一旦修改类名,就非常麻烦
  2. 每次的调用都要写一长串代码,有时候为了省事复制粘贴,忘记改类名,就会出错
  3. 有时候需要传参,使用call与apply调用用法不统一

如何做到像java那样呢

public MyClass2 extends MyClass1{
    public void say() {
        super.say();
        System.out.println('MyClass2 say hello world!');
    }
} 

ExtJs4就完美解决了

Ext.define('MyClass1',{
	say: function(){
		console.log('hello1');
	}
})
Ext.define('MyClass2',{
	extend:'MyClass1',
    say: function(){
        this.callParent(); // 调用父类的say()
        // 如果要为父类方法传参,只需要像下面这样写
        //this.callParent(arguments);
        //this.callParent([param1, param2]);
        console.log('hello2');
    }
});
Ext.define('MyClass3',{
	extend:'MyClass2',
    say: function(){
        this.callParent(); // 调用父类的say()
        // 如果要为父类方法传参,只需要像下面这样写
        //this.callParent(arguments);
        //this.callParent([param1, param2]);
        console.log('hello3');
    }
});
时间: 2024-11-05 23:28:53

ExtJs4组件中initComponent方法介绍以及为什么要使用this.callParent();的相关文章

父组件调用子组件中的方法- this.$refs.xxx.子组件方法();

子组件中有一个说的方法 在父组件中去调用当你点击的时候 去调用子组件中的方法 fu.vue 在父组件的方法中调用子组件的方法,很重要 this.$refs.mychild.parentHandleclick(); { <template> <div> <button @click="clickParent">点击 调用子组件</button> <child ref="mychild"></child&

微信小程序自定义组件的使用以及调用自定义组件中的方法

在写小程序的时候,有时候页面的内容过多,逻辑比较复杂,如果全部都写在一个页面的话,会比较繁杂,代码可读性比较差,也不易于后期代码维护,这时候可以把里面某部分功能抽出来,单独封装为一个组件,也就是通常说的自定义组件,自定义组件类似于页面,它有wxml 模版.wxss 样式和js文件,然后在页面中使用该自定义组件即可. 例如,我的自定义组件代码结构是这样的: myComponent文件就是我所创的自定义组件,myComponent.wxml文件代码为: <view class="inner&q

react:在一个组件中调用别的组件中的方法

先介绍一下要解决的问题:react中一个组件A和一个组件B,其中B是被connect(connect是redux中的方法)包装过的组件,包装成BContainer,A和BContainer的关系是兄弟关系,在同一个父元素下渲染.现在我们要在点击A的时候调用B中的方法 解决思路:主要是用到ref获取BContainer组件挂载之后的实例 render(){ var b = null return(<BContainer ref={(node) => b = node}/>) } ref中的

各组件中的方法使用

Yii是一个基于组件的框架,所以了解各组件中都有哪些方法,及其作用和使用方式是学好该框架的重要因素. 首先,很多组件都有widget()方法,比如yii\grid\GridView和yii\widgets\LinkPager组件.这两个组件是在视图中使用的,我将它们分类为视图组件 GridView组件用来显示网格或表格,LinkPager组件用来显示分页,都通过调用widget方法,如GridView::widget([]),LinkPager::widget([]),该方法有一个数组参数,数组

5中聚类方法介绍

概要 原文参考链接:https://towardsdatascience.com/the-5-clustering-algorithms-data-scientists-need-to-know-a36d136ef68 聚类是常用于机器学习中的将数据分组合并的方法.聚类是一种非监督学习方法,其目的旨在将数据按照不同的特征进行分类.在特征分类理论中,同一组的数据具有相似的特征. 如下将介绍在机器学习中常用的5种将数据聚类的方法并分析其优劣之处. K-means K-means 是聚类算法中最常见的

Python中__init__方法介绍

__init__方法在类的一个对象被建立时,马上运行.这个方法可以用来对你的对象做一些你希望的初始化.注意,这个名称的开始和结尾都是双下划线.代码例子:#!/usr/bin/python# Filename: class_init.pyclass Person:    def __init__(self, name):        self.name = name    def sayHi(self):        print Hello, my name is, self.name p =

vue组件之间的通信以及如何在父组件中调用子组件的方法和属性

在Vue中组件实例之间的作用域是孤立的,以为不能直接在子组件上引用父组件的数据,同时父组件也不能直接使用子组件的数据 一.父组件利用props往子组件传输数据 父组件: <div> <child v-bind:my-message="parentMsg"></child>//注意传递参数时要用-代替驼峰命名,HTML不区分大小写 </div> 子组件: Vue.component('child', { // camelCase in Ja

父组件中调用子组件的方法和属性

方案:利用ref属性可以获取到dom元素或者是子组件,从而可以调用子组件的方法(注意2.0版本用ref取代了el) 1.当ref直接定义在dom元素上时,则通过this.$refs.name可以获取到dom,对dom进行原生的操作 <div class="foods-wrapper" ref="foods-wrapper"> 通过this.$refs获取到dom进行操作(注意ref属性的命名不能用驼峰,同时获取的时候也不能用) let menuList

VUe.js 父组件向子组件中传值及方法

父组件向子组件中传值 1.  Vue实例可以看做是大的组件,那么在其内部定义的私有组件与这个实例之间就出现了父子组件的对应关系. 2. 父子组件在默认的情况下,子组件是无妨访问到父组件中的数据的,所以要想在子组件中使用父组件的数据的时候,就需要以属性绑定的形式,将父组件的数据传递到子组件中.     3. 通过属性绑定传递来的数据无法再子组件中直接使用,需要在props中重新定义以后才可以使用.例:props:['变量名'].props是一个数组.    4. 子组件中的data数据都是私有,子