zoukankan      html  css  js  c++  java
  • ExtJS初学笔记---Ext.Msg.alert无效果

    最近开始学ExtJS,书上的第一个例子是:
    1
    2
    3
    Ext.onReady(function(){
        Ext.Msg.alert('Hello.', 'Hello');
    });
    这个是ExtJS最简单的一个例子了,就是在页面上显示一个对话框,可是我运行却什么都没有显示。。。
    在浏览器开发者工具的控制台中有如下错误信息:
    (Cannot call method 'alert' of undefined)
     
    这让我很是无语,因为可以确定已经正确引入ExtJS所需的js文件了,可是为什么说alert函数没有定义呢?
    我想可能是因为书本比较旧(书中用的版本是3.0,我用的是4.0)缘故吧,于是查看Ext的文档,发现了几点信息:
     
    一,Ext.Msg是Ext.window.MessageBox.的别名
    二,在extjs4中引入的新的类定义的方式:
    1
    Ext.define(className, members, onClassCreated);
    有如下范例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Ext.define('My.sample.Person', {
        name: 'Unknown',
     
        constructor: function(name) {
            if (name) {
                this.name = name;
            }
        },
     
        eat: function(foodType) {
            alert(this.name + " is eating: " + foodType);
        }
    });
     
    var aaron = Ext.create('My.sample.Person', 'Aaron');
    aaron.eat("Salad"); // alert("Aaron is eating: Salad");
    可以得知Ext中类的定义用define方法,实例化类用create方法。
     
    知道怎么实例化类后,我们就可以试着实例化Ext.window.MessageBox,测试如下代码:
    1
    2
    3
    4
    Ext.onReady(function(){
        var msg=Ext.create('Ext.window.MessageBox');
        msg.alert('Hello.', 'Hello');
    });
    运行成功!
     
    但是Ext.Msg应该是个全局的单例,我们这种用法终究感觉有些别扭,来看看Ext的源码,瞧瞧Ext.Msg到底在哪里会被初始化:
    1
    2
    3
    4
    5
    Ext.define('Ext.window.MessageBox', {
        .....
    }, function() {
        Ext.MessageBox = Ext.Msg = new this();
    });
    在define函数的第三个参数中Ext.Msg被定义,那这个函数何时会被调用呢?
     
    请看define方法的第三个参数onClassCreated的描述:
    Callback to execute after the class is created, the execution scope of which (this) will be the newly created class itself.
    即这个函数会在类被实例化时调用,在这个函数中new this()就是new这个类本身。
     
    可知估计是Ext4之后像Ext.Msg这样的全局单例并不会在程序开始的时候就会定义,而是需要你实例化该类一次之后才会被定义。
    于是有如下代码:
    1
    2
    3
    4
    Ext.onReady(function(){
        Ext.create('Ext.window.MessageBox');    //全局只要调用一次即可
        Ext.Msg.alert('Hello.', 'Hello');
    });
    Ext中其他的全局单例也是一个道理吧。
  • 相关阅读:
    CF1051F The Shortest Statement 题解
    CF819B Mister B and PR Shifts 题解
    HDU3686 Traffic Real Time Query System 题解
    HDU 5969 最大的位或 题解
    P3295 萌萌哒 题解
    BZOJ1854 连续攻击游戏 题解
    使用Python编写的对拍程序
    CF796C Bank Hacking 题解
    BZOJ2200 道路与航线 题解
    USACO07NOV Cow Relays G 题解
  • 原文地址:https://www.cnblogs.com/mushan/p/3383409.html
Copyright © 2011-2022 走看看