ExtJs十一(ExtJs Mvc图片管理之一)

原文 http://www.cnblogs.com/aehyok/archive/2013/04/27/3048278.html

前言

图片管理要在两个地方使用:一是标签页内的图片管理,一是文章内容编辑时嵌套到插入图片的窗口内。因而,将图片管理做成一个扩展比较方便。当然,做成MVC模式也行,不争论,不讨论。

要记住,扩展要写在Scripts\ExtJS\Ux目录下,因为在路径的设置中,扩展目录是指向这里的。在该目录下创建一个名为PicManager.js的脚本文件。

片管理的主要界面分两部分,左边以树的形式列出文件目录,要实现目录的添加、删除和编辑功能,右边则以预览形式显示目录中的文件,主要功能是上传文件和删除文件。

上传文件将使用Swfupload,它可一次上传多个文件,到http://code.google.com/p/swfupload/可 下载到最新版本的文件,当前示例使用的是2.5.0 beta版本。先下载SWFUpload_v250_beta_3_samples.zip这个文件,解压后,把demos目录下的swfupload目 录复制到解决方案的Scripts目录下。然后下载swfupload.swf.v2.5.0.beta3.2.zip文件,把该文件里的文件覆盖 swfupload目录下的文件。

正题

 现在先来完成左边的目录树。使用树,必然用到TreeStore,因而要从这里入手。而TreeStore可定义模型,也可不定义模型,这个视情 况而定。目前的情况是,目录的添加、编辑和删除操作,都需要给出父目录和目录名称,目录名称可使用字段text,父目录则是一个附加字段。目录的操作比较 简单,因而直接在模型内完成就行了,因而定义模型是比较好的方法。模型的定义可以独立成一个文件,也可以在initComponet方法内定义。如果在独 立的文件定义,就要在扩展中添加requires配置项引用模型。这里将在initComponet方法内定义,代码如下:

        Ext.define("Folder", {
            extend: "Ext.data.Model",
            fields: ["text", "id", "parentId"],
            validations: [{
                type: 'presence',
                field: 'text'
            }],
            proxy: {
                type: 'ajax',
                api: {
                    read: 'Folder/List',
                    create: 'Folder/Add',
                    destroy: 'Folder/Delete',
                    update: 'Folder/Edit'
                },
                reader: {
                    messageProperty: "Msg",
                    type: 'json',
                    root: "data"
                },
                writer: {
                    type: "json",
                    encode: true,
                    root: "data",
                    allowSingle: false
                },
                listeners: {
                    exception: ExtMVCOne.ProxyException
                }
            }
        });

定义中,parentId用来记录父目录。添加一个验证项,目录名称不能为空。在代理定义中,reader和writer的定义可标准化数据的输入输出,这个与用户中的定义是一样的。代理的API则定义了操作的提交路径。

接下来定义TreeStore,代码如下:

        me.treestore = Ext.create("Ext.data.TreeStore", {
            root: { id: "/", text: "根目录", expanded: true },
            model: "Folder"
        });

TreeStore的定义,除了模型,很重要的一个定义就是根节点了。这里根节点的id使用“/”,是为了方便后台将虚拟路径转换为实际路径。

接着定义树面板,代码如下:

        me.tree = Ext.widget("treepanel", {
            title: "文件目录", region: "west", collapsible: true, rootVisible: true,
            width: 250, minWidth: 100, maxWidth: 500, split: true, store: me.treestore
        });

因为使用边框布局,因而要混入边框布局的配置项。这里还设置了显示根目录,这是因为系统将允许在根目录上传文件。

现在来完成右边的文件预览。还是先从模型开始,代码如下:

        Ext.define('File', {
            extend: 'Ext.data.Model',
            fields: [
                'filename', 'path',
                "modify",
                { name: "size", type: "int" }
             ]
        });

这里的字段,除了文件名、路径是必须的,其它的可根据自己的显示内容定义。在这里将显示最后编辑时间、文件大小。

接着是定义Store,代码如下:

        me.filestore = Ext.create("Ext.data.Store", {
            batchActions: false,
            remoteFilter: false,
            remoteSort: false,
            pageSize: 50,
            model: "File",
            proxy: {
                type: "ajax",
                api: {
                    read: 'File/List',
                    destroy: 'File/Delete'
                },
                reader: {
                    type: 'json',
                    root: "data"
                },
                writer: {
                    type: "json",
                    encode: true,
                    root: "data",
                    allowSingle: false
                },
                listeners: {
                    exception: SimpleCMS.ProxyException
                }
            }
        });

这里的API没有create和update配置项是因为,文件是上传的,不能通过该方式提交,而文件一般也不进行更新,而是先删除后再上传。

接着是用数据视图来显示文件,代码如下:

        me.dataview = Ext.widget("dataview", {
            store: me.filestore, autoScroll: true,
            multiSelect: true, selectedItemCls: "selected", itemSelector: 'div.imageList',
            overItemCls: "overitem", trackOver: true,
            tpl: [
                '<tpl for=".">',
                    '<div class="imageList">',
                        '<img width="160" height="160" src="../Thumbnail{path}{filename}?width=160&height=160" data-qtip="文件名:{filename}<br/>修改日期:{modify}<br>大小:{size:this.filesize}" /><br/>',
                        '<p class="ellipsis">{filename}</p>',
                    '</div>',
                '</tpl>',
                '<div class="x-clear"></div>',
                {
                    filesize: function (size) {
                        if (size < 1024) {
                            return v + " 字节";
                        } else if (size < 1048576) {
                            return (Math.round(((size * 10) / 1024)) / 10) + " KB";
                        } else {
                            return (Math.round(((size * 10) / 1048576)) / 10) + " MB";
                        }
                    }
                }
            ]
        });

定义数据视图的关键就是模板的定义,这个在书中有详细说明和示例,这里就不详细说了。在这里在模板添加了一个filesize方法,用来转换文件大小的显示格式。

因为视图不是面板,没有工具栏组件,因而要在其外面套一个面板用来放置工具栏,所以在视图的定义中没有边框布局的配置项。

下面来完成整个界面框架,代码如下:

        me.items = [
            me.tree,
            { title: "图片文件", region: "center", layout: 'fit', items: [me.dataview] }
        ];

现在可以调试一下界面,看看怎么样了。先切换到主面板(mainpanel.js)的视图定义,为图片管理加回布局,布局类型为Fit。然后切换到主面板的控制器,在图片管理的activate方法内,删除alert语句,添加以下代码:

                        var view = Ext.create('Ext.ux.PicManager', {});
                        var view = Ext.widget("picmanager");
                        panel.add(view);

这里一定要注意,create方法的第一参数必须为字符串,这样,Ext才会去自动加载类文件。也不能使用widget方法去创建,因为类还没注 册,Ext不知道别名为picmanager指向的是那个类,也就不会去自动加载了。如果不使用这样的方式,可在控制器中加入requires配置项,指 定要加载该类,不过这与初衷相违了。

为了调试方便,可在主面板视图定义中加入配置项activeTab,用来指定初始激活显示那个标签页,这样就不用每次调试都要单击一次标签了。图片管理是第二个标签页,因而设置当前索引为1。

就这样页面就暂时加载出来了。

时间: 2024-10-29 23:20:04

ExtJs十一(ExtJs Mvc图片管理之一)的相关文章

ExtJs十一(ExtJs Mvc图片管理之二)

原文 http://www.cnblogs.com/aehyok/archive/2013/04/28/3050165.html 接着图片管理一http://www.cnblogs.com/aehyok/archive/2013/04/27/3048278.html. 先来完成树目录的显示.开始前,现在解决方案中创建一个Upload目录用来存放上传的图片,为了便于测试,在Upload目录下随便添加两个目录,这里添加1和2. 好,现在创建一个名为FolderController的控制器,添加必要的

ExtJs七(ExtJs Mvc创建ViewPort)

原文 http://www.cnblogs.com/aehyok/archive/2013/04/22/3036084.html 前言 在4.1的时候,要先创建一个扩展于Ext.app.Application的类,然后用create创建它的实例来开始应用程序的.而在 4.1.1,则可直接调用application方法开始执行应用程序,简化了.调用application方法,其参数是一个配置对象,主要配置项有以 下三个: name:用来定义应用程序的名称,在这里是ExtMVCOne. appFol

ExtJS布局:制作后台管理布局

一个后台管理页面大概头部.左侧导航.右侧的在线用户(可有可无)和状态栏(不是必须) 头部一般放一些logo.登陆用户信息和提醒事项等 我上面给出的这个图片就是我用ExtJS实现的一个后台管理页面布局,源代码如下: Ext.onReady(function () { Ext.create('Ext.container.Viewport', { layout: 'border', items: [{ region: 'north', html: '<h1 class="x-panel-head

ExtJs八(ExtJs Mvc创建ViewPort续)

原文 http://www.cnblogs.com/aehyok/archive/2013/04/23/3037588.html 前言 现在要考虑的是如何加载标签页内的内容.虽然标签页默认是延迟渲染的(deferredRender值默认为true),但是它会预加载所有的类, 因而当类文件很多的时候,加载时间就是一大问题了.这个,也可通过SDK打包的方式解决,不过在设计阶段还是要考虑的.另一种好的解决方法是,只使用标签 页的标签,而不使用其主体加载内容,另外使用一个容器,内部使用CardLayou

extjs 如何实现“照片: 图片”的格式?

问题描述 extjs 如何实现"照片: 图片"的格式? 在这个问题中,图片是动态获取的,这样的功能如何可以实现?希望大家指教. 解决方案 用计时器定时更新img对象的src加载新图片,src也可以为动态页,用动态页输出图片数据,注意加时间戳防止缓存 解决方案二: Ext.create('Ext.panel.Panel', { renderTo: document.body, title: 'test' , layout: { type: 'hbox', align: 'middle'

图片管理新生代神器PINCAP全方位剖析

  设计师的职业生涯就像一棵树,素材库与灵感库交织出了年轮,从某方面反映着你的成长经历.不知道大家的灵感库经历了怎样的演变与迁徙,至少我的是几经辗转. 起先根本没有收集意识,需要什么临时找,几个网页书签就是全世界.从实习公司的老师那里拷来一套商业图库,10几个G.看得心花怒放,每件素材看着都精美无比.很长一段时间,那个文件夹就是我全部的上升空间,探索没有尽头.然而这个世界再精彩,也难以为我所用.文件多如牛毛,分类方式不合我的逻辑,找素材还不如百度来得快.我这才第一次意识到个人积累的意义. 于是开

个人博客图片管理(方便管理,大家忽略)

RT,个人博客图片管理(方便管理,大家忽略)

c# 4 0-vs 2010 写的图片管理 应用程序。用 vs 2010 生成安装文件,安装后打开时提示错误

问题描述 vs 2010 写的图片管理 应用程序.用 vs 2010 生成安装文件,安装后打开时提示错误 问题事件名称: CLR20r3 问题签名 01: pictureview.exe 问题签名 02: 1.0.0.0 问题签名 03: 548ba10c 问题签名 04: mscorlib 问题签名 05: 4.0.30319.18444 问题签名 06: 52717edc 问题签名 07: 314 问题签名 08: 4f 问题签名 09: System.ArgumentOutOfRange

功能强大界面华丽 八款图片管理软件推荐

随着互联网及数码技术的普及,图片及数码照片成了我们生活中不可或缺的一部分,如何整理这么多的图片及相片,如何方便的查找和查看这些图片成了令人痛疼的事情.图片查看及管理软件的诞生很大程度上解决了这个难题.下面笔者就整理了几个目前最常用的图片管理软件,希望对各位网友管理图片有所帮助. 一.微软自带图片管理软件 微软在图片管理软件方面几乎可以算得上的空白,或者基本上无人问津.在Windows 7的Windows Media Center中微软提供了图片管理的功能,但是由于操作比较复杂并且不方便查看所以并