Sencha 控制器简介(Ext.app.Controller)

本文适用于 Sencha Touch 2.x / ExtJS 4.x。

控制器,是一个完全将流程按面向对象方式设计的程序流程中的组件。例如,我们写最普通的PHP程序,页头包含 SESSION 模块,然后是访问控制。但若想,增加对主机名,子域名控制,则每一个包含的页面,都要再次增加包含之。或要么 在SESSION 模块,或要么在访问控制模块处增加一个包含文件。这样的话,程序逻辑将变得相当混乱。如果其中有出错与跳转,那么,势必会出现在不需要加载的页面跳来跳去。

控制器的目的,就是让页面请求最终到达所需要的页面。并且是基于面向对象的流程的。

通常:控制器,必须要有Host, SubDomain, IP,URL,ACL 的路由检测。由于现在一个网站,同时有浏览器与手机的,所以,还要有 UserAgent 检测。控制器才能做到最为方便地将一个请求映射到一个模块类的一个方法(事件)中。

  • 在应用中所产生的行为动作或事件都可以归并到控制器(Controllers)的范畴之内。
  • 比如一个简单的事件,在页面上有一个按钮,这个按钮弹出某些文字的行为,将会产生一个 tap 事件,负责监听这个单击 tap 事件的动作便是控制器。
  • 对于视图和模型而言,控制器其角色在于将两者绑定在一起。

控制器与 Ext.app.Application 之间的关系 Relation to Ext.app.Application

控制器贯穿于应用程序整体,在代码上下文经常要访问控制器的引用。一个典型的应用程序起码不止一个控制器,多个控制器来实现程序内不同的功能。例如一个电子商务网站,将会有订单的控制器、顾客的控制器或产品的控制器等等。

全家对象 Ext.app.Application 的 controllers 配置项保存了 ST2 程序的所有控制器。控制器一般不经过程序员来实例化,而是在框架内部中由 Application 对象实例化并保存实例的引用,因此如果我们 new 一个控制器出来使用那便是多此一举。

首先要介绍的是控制器的一对“活宝”:refs 引用项 及 control。

Refs 其实就是组件选择符(ComponentQuery),相似的概念我们在 CSS Selector 样式选择符中见到过,输入查询条件来选择特定的元素从而与其他的元素区分开来。如同 CSS 拥有强大的 jQuery /Szzla 那般,这里的组件 refs 也有一个不俗的 ComponentQuery。通过相似的概念我们理解起来也就比较容易了。当然,我们单单只是获取了组件后没有用,还必须把我们动作逻辑与组件关联起来。怎么做?我们看看下面一个简单的例子,这是一个点击按钮然后登出的动作过程。

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

    config: {
        refs: {
            nav: '#mainNav'
        }
    },

    addLogoutButton: function() {
        this.getNav().add({
            text: 'Logout'
        });
    }
});

从结构上看,我们所说的 ref 仅仅是 key/value 结构的一种。key 标识引用的名称,既然为名称那么任意您设置,比如这里 nav 是导航的意思;value 表示选择符(selector),选择哪个或哪些组件就是通过这个组件选择符。必须指明的是,组件选择符是 ST 创造概念,也许其他 JS  框架页会有,目的是为了方便程序获取特定的对象——但必须说明这不是一个适普性的概念,只有某些框架提供才会支持。比如这里的 #mainNav 就是一个组件选择符,那么框架会根据这个条件(标识
id 为 mainNav)查询符合条件的组件。 

当我们需要访问这个组件的时候,可以通过 getNav() 函数获取组件。所有 refs 项都通过反射生成 getter/setter 方法,然后供程序员调用。这有存在一种默认的格式:总是用 get 开头,然后第一个字母变为大写,比如 nav --> getNav(),返回导航组件对象。

Ext.create('Ext.Toolbar', {
    id: 'mainNav',
    items: [
        {
            text: 'Some Button'
        }
    ]
});

像 nav : '#mainNav'这样,凭借组件的自身特征作为选择符条件使用的情形不是很多,更多的是在垂直方向写出组件层次定位组件,如“tabpanel panel[name=fish] infopanel”。

时间: 2024-09-23 04:29:28

Sencha 控制器简介(Ext.app.Controller)的相关文章

app controller azure-APP Controller怎么连接中国区azure

问题描述 APP Controller怎么连接中国区azure APP Controller怎么连接中国区azure 连接报错 类别: Critical 描述: The server failed to authenticate the request. Verify that the certificate is valid and is associated with this subscription. 详细信息: 类别: Critical 消息: System.Net.WebExcept

App Controller+混合云,如何处理

在这个云计算盛行的世道,如果你还尚未有机会涉足公共云,我建议你不妨尝试一下.你可以用浏览器,导航至www.windowsazure.com,注册一个可以免费使用90天的帐户.现阶段,云计算的趋势只会增不会减,尤其是在VMware-亚马逊"施展大手笔"以及传闻的VMware公共云解决方案之后,近几年公共云将接过企业数据中心的工作负载. 尽管这么说,Windows Azure还是提供了一套优秀的工具,用于测试工作负载在公共云环境下的情况.对于已围绕微软系统中心(System Center)

关于一个 new Ext.app.SearchField的问题

问题描述 [/color]下面红色显示的部分是一个查询框,但是没有效果,有什么问题?他是更具那个属性查的,我要指定按照某一属性查询该怎么做?var grid_daily_hq = new Ext.grid.GridPanel({autoScroll:true,autoShow:true,border: false, store: store_daily_hq,stripeRows:true,cm:cm,sm: new Ext.grid.RowSelectionModel({singleSelec

域控制器简介

"域"的真正含义指的是服务器控制网络上的计算机能否加入的计算机组合.一提到组合,势必需要严格的控制.所以实行严格的管理对网络安全是非常必要的.在对等网模式下,任何一台电脑只要接入网络,其他机器就都可以访问共享资源,如共享上网等.尽管对等网络上的共享文件可以加访问密码,但是非常容易被破解.在由Windows 9x构成的对等网中,数据的传输是非常不安全的. 不过在"域"模式下,至少有一台服务器负责每一台联入网络的电脑和用户的验证工作,相当于一个单位的门卫一样,称为&qu

2017年第1贴:EXT.JS使用MVC模式时,注意如何协调MODEL, STORE,VIEW,CONTROLLER的关系

也调了快一天,死活找不到窍门. MODEL, STORE,VIEW的调置测试了很久,试了N种方法,不得其果. 最后,试着在APPLICATION里加入CONTROLLER, 在CONTROLLER里加入相应的STORE和VIEW支持, 搞定. 元旦踩过两个坑,继续前行!!!:) Ext.define('Packt.Application', { extend: 'Ext.app.Application', requires: [ 'Packt.overrides.tree.ColumnOverr

Sencha Touch 历史支持

路由.深链接以及后退按钮 Routing, Deep Linking and the Back Button Sencha Touch 2 提供完整的历史与深链接的支持,使得我们的 Web 应用拥有以下两点大的好处: 浏览器的"后退"按钮在你的应用中有效了,也就是说,虽然按下了后退键,但浏览器并不会立刻刷新,而是仍停留在当前的页面中. 可以使用"深链接"了,也就是说,可以分配的一个 url,直达制定的页面(在同一个页面中). 上述功能综述之,就是为了更好地与原生程序

ExtJS简单的动画效果(ext js淡入淡出特效)

1.html页面:Application HTML file - index.html <html> <head> <title>ExtJs fadeIn() and fadeOut() example</title> <link rel="stylesheet" type="text/css" href="extjs/resources/css/ext-all.css"> <st

AngularJS控制器之间的数据共享及通信详解_AngularJS

AngularJS 本身已经提供了像指令 Directive 和 服务 Service 一类的方式,来实现数据和代码的共享和复用,但在实际的项目开发中,或许是处于懒惰,亦或是为了便利,总会想在两个控制器之间,直接进行数据的共享通信,或者是函数与方法的调用,这里我们就看看有哪些方法可以满足这个要求. 单例服务 单例服务是 AngularJS 本身支持的数据和代码共享方式,因为是单例的,所有的控制器访问的便是同一份数据.比如,下面的 Service 便可以实现: angular .module('a

extjs 界面调用Controller的方法

问题描述 请问我在界面中,如何调用Controller的方法,我按照网上说的getController()等试过几个,都不行,说没有getController()方法,应该是我的写法问题,所以贴上代码,请各位帮我看看Controller:Ext.define('app.controller.UserController', {extend : 'Ext.app.Controller', ...... ...... function1: function(btn) { alert("test&qu