Ext JS 4 架构你的应用 第2节 (官方文档翻译)

原文地址:http://docs.sencha.com/extjs/4.0.7/#!/guide/mvc_pt2

【翻译 by 明明如月 QQ 605283073 本章节配套项目代码将在第3节给出】

上一节:Ext
JS 4 架构你的应用 第1节 (官方文档翻译)

下一节:Ext JS4 架构你的应用 第3节 (官方文档翻译)

在上一篇文章中我们介绍了,怎样基于Ext JS构建一个 潘多拉风格的应用。

让我们探讨一下Model-View-Controller(模型-视图-控制器)架构以及怎样将其应用到相对复杂一点的

含有多个视图和模型的UI应用中。

定义你的应用

在Ext JS 3中 Ext.onReady是应用的入口,开发者也不得不自己设计一个应用架构。

在 Ext
JS 4 中我们介绍了一种类似MVC模式的架构。这个模式将帮助我们创建应用的最佳实践。

通过新的MVC包编写应用的切入点使用的是 Ext.application方法。该方法将为你创建一个Ext.app.Application 实例。

页面加载完成以后将会触发此启动方法。

应该用此方法来代替以前的 Ext.onReady ,在此方法中添加自动创建一个viewport和设置命名空间(namespace).

app/Application.js

Ext.application({
    name: 'Panda',
    autoCreateViewport: true,
    launch: function() {
        // This is fired as soon as the page is ready
    }
});

name  配置对应的是命名空间。

应用中所有的视图、模型、存储、控制器等都将在此命名空间内。

通过将autoCreateViewport
设置为true,按照约定,框架将会将app/view/Viewport.js文件包含进来

一个类名为 Panda.view.Viewport的类应该在此文件中定义。

Viewport 类

当我们思路我们这个UI需要哪些视图的时候,我们关注的是每个部分。Viewport 所扮演的是应用中各个视图部分的粘合剂。

它加载应用布局所需的各种视图。我们发现渐进式地来定义你的视图并且将其加入viewport中是构建你UI的最快方式。

创建一个构建块

通过利用前面文章介绍的内容,我们可以一次定义出多个视图。

app/view/NewStation.js

Ext.define('Panda.view.NewStation', {
    extend: 'Ext.form.field.ComboBox',
    alias: 'widget.newstation',
    store: 'SearchResults',
    ... more configuration ...
});

app/view/SongControls.js

Ext.define('Panda.view.SongControls', {
    extend: 'Ext.Container',
    alias: 'widget.songcontrols',
    ... more configuration ...
});

app/view/StationsList

Ext.define('Panda.view.StationsList', {
    extend: 'Ext.grid.Panel',
    alias: 'widget.stationslist',
    store: 'Stations',
    ... more configuration ...
});

app/view/RecentlyPlayedScroller.js

Ext.define('Panda.view.RecentlyPlayedScroller', {
    extend: 'Ext.view.View',
    alias: 'widget.recentlyplayedscroller',
    itemTpl: '<div></div>',
    store: 'RecentSongs',
    ... more configuration ...
});

app/view/SongInfo.js

Ext.define('Panda.view.SongInfo', {
    extend: 'Ext.panel.Panel',
    alias: 'widget.songinfo',
    tpl: '<h1>About </h1><p></p>',
    ... more configuration ...
});

这里我们忽略了组件的一些配置,因为这些配置和本文核心内容无关。

在上面的配置中,你可能会注意到我们配置了3个存储。

models 和 stores

通常来说在服务端我们可以使用静态json文件里的模拟的数据。

以后我们可以参考静态json文件的内容去实现服务端的动态数据处理。

对于我们的应用,我们决定使用两个模型Station和Song.我们也需要为这两个模型创建3个存储来绑定到数据组件上。

每个存储都将从服务端来获取数据。模拟的数据文件类似下面的内容。

静态数据

data/songs.json

{
    'success': true,
    'results': [
        {
            'name': 'Blues At Sunrise (Live)',
            'artist': 'Stevie Ray Vaughan',
            'album': 'Blues At Sunrise',
            'description': 'Description for Stevie',
            'played_date': '1',
            'station': 1
        },
        ...
    ]
}

data/stations.json

{
    'success': true,
    'results': [
        {'id': 1, 'played_date': 4, 'name': 'Led Zeppelin'},
        {'id': 2, 'played_date': 3, 'name': 'The Rolling Stones'},
        {'id': 3, 'played_date': 2, 'name': 'Daft Punk'}
    ]
}

data/searchresults.json

{
    'success': true,
    'results': [
        {'id': 1, 'name': 'Led Zeppelin'},
        {'id': 2, 'name': 'The Rolling Stones'},
        {'id': 3, 'name': 'Daft Punk'},
        {'id': 4, 'name': 'John Mayer'},
        {'id': 5, 'name': 'Pete Philly & Perquisite'},
        {'id': 6, 'name': 'Black Star'},
        {'id': 7, 'name': 'Macy Gray'}
    ]
}

Models(模型)

在Ext JS4 中的模型和 Ext
JS 3中的Records (记录)非常像。

一个关键不同点是在模型中你可以定制一个代理、校验和关联。

在Ext JS4中Song
模型类似如下内容:

app/model/Song.js

Ext.define('Panda.model.Song', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'artist', 'album', 'played_date', 'station'],

    proxy: {
        type: 'ajax',
        url: 'data/recentsongs.json',
        reader: {
            type: 'json',
            root: 'results'
        }
    }
});

你可以看到我们为模型定义了一个代理(proxy )。

这一般说来是一个比较好的时间,它允许你在不需要存储(store)的条情况下获取和保存模型实例。

我们接着定义Station
 类。

app/model/Station.js

Ext.define('Panda.model.Station', {
    extend: 'Ext.data.Model',
    fields: ['id', 'name', 'played_date'],

    proxy: {
        type: 'ajax',
        url: 'data/stations.json',
        reader: {
            type: 'json',
            root: 'results'
        }
    }
});

Stores(存储)

Ext JS 4中,多个存储可以使用同一个数据模型,甚至存储还可以从不同的资源来加载数据。

在我们的例子中Station 模型将被 SearchResults
和 Stations存储使用,分别从不同的地方加载数据。

一个是返回搜索结果,一个是返回用户喜爱的站点的数据。为了达到这个目的,我们的存储需要重写模型中定义的Proxy。

app/store/SearchResults.js

Ext.define('Panda.store.SearchResults', {
    extend: 'Ext.data.Store',
    requires: 'Panda.model.Station',
    model: 'Panda.model.Station',

    // Overriding the model's default proxy
    proxy: {
        type: 'ajax',
        url: 'data/searchresults.json',
        reader: {
            type: 'json',
            root: 'results'
        }
    }
});

app/store/Stations.js

Ext.define('Panda.store.Stations', {
    extend: 'Ext.data.Store',
    requires: 'Panda.model.Station',
    model: 'Panda.model.Station'
});

app/store/RecentSongs.js

Ext.define('Panda.store.RecentSongs', {
    extend: 'Ext.data.Store',
    model: 'Panda.model.Song',

    // Make sure to require your model if you are
    // not using Ext JS 4.0.5
    requires: 'Panda.model.Song'
});

当前的 Ext JS版本,在一个存储中的模型属性不会自动创建一个依赖。这就是为什么我们不得不指定requires
来动态加载模型的原因。

同样地,根据惯例,我们经常将store的名字写成复数的形式,而把模型名写成单数形式。

为我们的应用添加 stores (存储)和models(模型)

app/Application.js

Ext.application({
    ...
    models: ['Station', 'Song'],
    stores: ['Stations', 'RecentSongs', 'SearchResults']
    ...
})

Ext JS 4 MVC 包的另外一个优势是应用将自动加载在application中配置的模型和存储。

应用粘合剂(viewport)

目前为止views, models 和stores都有了,我们需要将其粘合在一起。我们将一个个视图添加到viewport中。

这对于调试任何一个错误的视图配置非常容易。

Ext.define('Panda.view.Viewport', {
    extend: 'Ext.container.Viewport',

Viewport 类通常拓展自 Ext.container.Viewport 这就使得你的应用可以占据浏览器窗口的所有可用空间。

   requires: [
        'Panda.view.NewStation',
        'Panda.view.SongControls',
        'Panda.view.StationsList',
        'Panda.view.RecentlyPlayedScroller',
        'Panda.view.SongInfo'
    ],

我们也设置了viewport的视图依赖。这里允许我们使用之前在视图中定义好的别名作为xtype的值。

   layout: 'fit',

    initComponent: function() {
        this.items = {
            xtype: 'panel',
            dockedItems: [{
                dock: 'top',
                xtype: 'toolbar',
                height: 80,
                items: [{
                    xtype: 'newstation',
                    width: 150
                }, {
                    xtype: 'songcontrols',
                    height: 70,
                    flex: 1
                }, {
                    xtype: 'component',
                    html: 'Panda<br>Internet Radio'
                }]
            }],
            layout: {
                type: 'hbox',
                align: 'stretch'
            },
            items: [{
                width: 250,
                xtype: 'panel',
                layout: {
                    type: 'vbox',
                    align: 'stretch'
                },
                items: [{
                    xtype: 'stationslist',
                    flex: 1
                }, {
                    html: 'Ad',
                    height: 250,
                    xtype: 'panel'
                }]
            }, {
                xtype: 'container',
                flex: 1,
                layout: {
                    type: 'vbox',
                    align: 'stretch'
                },
                items: [{
                    xtype: 'recentlyplayedscroller',
                    height: 250
                }, {
                    xtype: 'songinfo',
                    flex: 1
                }]
            }]
        };

        this.callParent();
    }
});

由于 Viewport拓展自Container,Container(容器)还不能有停驻元素,我们添加一个面板作为viewport的唯一元素。

由于viewport中laylout(布局)设置为fit,这个面板将和viewport的尺寸相同。

我们在视图中没有定义flex,
width, height等属性。因此我们可以非常容易的在一个地方就可以调整应用的整体布局,增加了架构的可维护性和灵活性。

应用逻辑

在Ext JS 3中,我们通常将应用的逻辑添加在视图的按钮处理器方法中,绑定子组件和拓展视图时重写拓展视图的方法。

然而正如你不应该在HTML里面写内联的CSS一样,我们也应该将视图和应用的逻辑分开。

Ext
JS 4中我们在MVC包里提供了controlleres(控制器) 类。

他们负责监听来之视图或者其他控制器的事件,并且实现对应事件的逻辑。这样的设计将带来很多好处。

一个好处是,你的应用逻辑不绑定视图实例。

另外在Ext
JS 3中,你有也许要嵌套多个视图,每个视图都添加应用逻辑。通过将应用逻辑移到控制器,变得更加集中,使得应用的维护和修改变得更加容易。

创建 Controllers(控制器)

app/controller/Station.js

Ext.define('Panda.controller.Station', {
    extend: 'Ext.app.Controller',
    init: function() {
        ...
    },
    ...
});

app/controller/Song.js

Ext.define('Panda.controller.Song', {
    extend: 'Ext.app.Controller',
    init: function() {
        ...
    },
    ...
});

当你的应用中包含了这些控制器,框架将自动加载这个控制器并且调用功能init方法。

在init方法中,你应该设置对视图和应用事件的监听器。

在大型的应用中,你也许希望在运行时再加载额外的控制器。你可以通过getController 方法来实现。

someAction: function() {
    var controller = this.getController('AnotherController');

    // Remember to call the init method manually
    controller.init();
}

当你在运行时想加载外部控制器,你一定要记住手动去调用init方法。

对我们的例子来说,如果我们想让框架加载和初始化我们的控制器,我们需要将其添加到application 的控制器数组中。

app/Application.js

Ext.application({
    ...
    controllers: ['Station', 'Song']
});

设置监听器

...
init: function() {
    this.control({
        'stationslist': {
            selectionchange: this.onStationSelect
        },
        'newstation': {
            select: this.onNewStationSelect
        }
    });
}
...

control方法传递一个组件必须的对象。在我们例子里,组件只需要简单的使用视图的xtype属性。

每个查询都绑定一个监听器配置。 在每个监听器配置里,我们想要监听事件名。

如果想要了解有哪些可用的事件可以查询API
文档搜索events(事件)部分。

监听器配置的值是一个当事件发生时执行的方法。这个方法的范围一般是控制器自身。

app/controller/Song.js

...
init: function() {
    this.control({
        'recentlyplayedscroller': {
            selectionchange: this.onSongSelect
        }
    });

    this.application.on({
        stationstart: this.onStationStart,
        scope: this
    });
}
...

除了RecentlyPlayedScroller视图中监听selectionchange
事件,我们也为应用事件设置了一个监听器。

我们通过application实例的on方法来实现。

每个控制器使用 this.application来访问application
实例。

Application 事件对于事件和多个控制器对应的情况下非常有用。

不是在每个控制器中都监听同一个视图事件,只有一个控制器监听此视图事件和出发一个应用范围的事件,其他控制器来监听。

这也允许控制器在不知道或者不相互依赖的情况下彼此交互。

我们的Song
控制器对新创建站点比较敏感,因为当创建新的站点时它需要更新song滚动条和歌曲信息。

我们看一下Station
控制器:

app/controller/Station.js

..
onStationSelect: function(selModel, selection) {
    this.application.fireEvent('stationstart', selection[0]);
}
...

我们只是简单地获取selectionchange 事件提供的单个选择项然后将其作为触发stationstart
事件的一个参数。

结论

在本文中,我们了解了应用的基本架构。下一节我们将了解更高级的控制器技术,通过实现我们的控制器行为和为视图添加更多的细节继续拓展我们的潘多拉应用。

时间: 2024-10-14 03:11:04

Ext JS 4 架构你的应用 第2节 (官方文档翻译)的相关文章

运用 Ext JS 4 的 MVC 架构

http://www.open-open.com/lib/view/open1350386395227.html http://www.ibm.com/developerworks/cn/web/1210_wangzh_extjsmvc/index.html Ext JS 4 简介 Ext JS 4 目前是 Sencha 的产品,4.x 的正式版本号是 4.0.7.Ext JS 4 提供商业版本,但如果您的项目是开源的,则可以免费使用 Ext JS 4.Ext JS 的论坛目前非常活跃:Ext

Ext JS学习第九天 Ext基础之 扩展原生的javascript对象

此文来记录学习笔记: •Ext对于原生的javascript对象进行了一系列的扩展,我们把他们掌握好,更能深刻的体会Ext的架构,从而对我们的web开发更好的服务, 源码位置,我们可以从开发包的这个位置找到这几个扩展的js源码: •extjs-4.1.1\src\core\src\lang\ •ExtJS扩展原生Javascript –Ext.Object –Ext.Number –Ext.String –Ext.Array –Ext.Function –Ext.Date –Ext.Error

Ext JS 6开发实例(一)

很久没写文章了,主要原因和大家差不多,都要为生活奔忙,搞了两个小项目.这两个小项目很凑巧,都可以使用Ext JS来开发,这正是练习使用Ext JS 6的好机会,自然不会错过. 很多读者可能会问,为什么不直接使用熟悉的Ext JS 4来开发,而使用结构完全改变了的Ext JS 6呢?首先,Ext JS 4的MVC模式,控制器的使用我觉得太繁琐了,不太喜欢,而6的修改为视图模型以及与视图绑定的控制器,我觉得写起代码来会挺舒服的.其次,对于组件的使 用等方面,熟悉Ext JS 4的,使用起Ext JS

Ext JS 6学习文档–第1章–ExtJS入门指南

Ext JS 入门指南 前言 本来我是打算自己写一个系列的 ExtJS 6 学习笔记的,因为 ExtJS 6 目前的中文学习资料还很少.google 搜索资料时找到了一本国外牛人写的关于 ExtJS 6 的电子书 [Ext JS 6 By Example].这份资料在 PACKT 上卖 35.99 刀的,当然了万能的 google 还是帮我下载到了 PDF 文档.大概看了一下,讲的很详细,例子也比较简单,容易理解,现我准备利用工作之余翻译这份文档,为自己学习加深理解,也希望能帮助更多的人学习.

【转载】《Ext JS 4 First Look》翻译之一:新特性

免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:^_^肥仔John      原文地址:http://www.cnblogs.com/fsjohnhuang/archive/2013/01/29/2880705.html 第一章 新特性 Extjs 4相对于之前的版本作出了重大的修正.其中包括全新的类系统.新平台的引入.API的修整和加强还有新组件的引入(如新的图表和图形组件).Extjs 4提供更快速.更稳定的用户体验,

sencha ext js 6 入门

Sencha Ext JS号称是目前世界上最先进和最强大的.支持多平台多设备的JavaScript应用程序开发框架.首先看一下Ext JS的发展简史. 1 Ext JS发展简史 YUI-Ext的作者Jack Slocum(杰克.斯洛克姆)打算对基于BSD协议的Yahoo User Interface (YUI)库进行自定义的扩展,但后来一度风头盖过其父辈YUI: 在2006年底,YUI-Ext被简化为Ext,反映了它作为一个框架的成熟和独立.该公司成立于2007年初,Ext现在为双执照,使用LG

Ext Js MVC系列一 环境搭建和MVC框架整体认识

因为最近项目当中需要用ext js 4做前端框架,所以就必须得学习它了.这个系列主要总结ext js MVC框架,这是ext js 4新增的开发模式,这篇文章主要从以下几点来进行总结. 1,项目目录结构2,相关css文件和js文件引用3,MVC框架整体认识 项目目录结构 Ext js 4遵循统一的目录结构,这个有点类似于ASP.NET MVC.MVC中,所有的类都放在app目录中,这个目录下有四个子目录(每个子目录代表一个命名空间),主要有controller,model,view和store.

Ext JS学习第五天 我们所熟悉的javascript(四)

此文用来记录学习笔记: •javascript之对象.面向对象 •可能对于高级语言你可能了解甚至精通OOP面向对象,那么对于javascript你又熟悉多少呢?我们一起来学习javascript面向对象,这样非常有帮助我们理解Ext的基础架构,Ext本身就是一个JS面向对象的框架. •使用json对象(JavaScript Object Notation) –JS对象的特性 –对于js来说json对象非常的重要,我们要学会如何操作json对象 •面向对象的概念 –如何定义一个类.如何实例化对象.

【翻译】在Ext JS 5种使用ViewControllers

原文:Using ViewControllers in Ext JS 5 简介 在Ext JS 5中,在应用程序架构方面提供了一些令人兴奋的改进,如添加了ViewModels.MVVM以及viewControllers来加强MVC应用程序.最重要的是,这些选择并不互斥,因此,可以采用增量的方式来介绍这些功能,又或者将他们混合在一起. 回顾控制器 在Ext JS 4,控制器就是一个从Ext.app.Controller的派生的类.这些控制器会使用类似CSS选择器(称为组件查询)来查找组件并对他们的