﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-菠萝三国-文章分类-EXT</title><link>http://www.blogjava.net/boluobn/category/24693.html</link><description>大江东去,浪淘尽...</description><language>zh-cn</language><lastBuildDate>Tue, 13 Nov 2007 00:51:33 GMT</lastBuildDate><pubDate>Tue, 13 Nov 2007 00:51:33 GMT</pubDate><ttl>60</ttl><item><title>EXT手册：Manual:Core:Working with JSON (Chinese) (转)</title><link>http://www.blogjava.net/boluobn/articles/160060.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 12 Nov 2007 14:20:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/160060.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/160060.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/160060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/160060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/160060.html</trackback:ping><description><![CDATA[<p>有一段JavaScript如下：</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>var&nbsp;obj&nbsp;=&nbsp;{ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;prop1:&nbsp;</span><span class="string">"a0~`!@#$%^&amp;*()-_+={}[]|\\:;\"',.?/"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;prop2:&nbsp;['x','y'], &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;prop3:&nbsp;{ &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nestedProp1:&nbsp;'abc',&nbsp; &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nestedProp2:&nbsp;</span><span class="number">456</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;</span></li>
    <li class=""><span>}&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>本文将会讨论如何把一个对象转换为JSON并将其发送到服务器。 <br />
編輯 使用Ext.urlEncode进行URL编码</p>
<p>首先我们看看Ext.urlEncode 这个方法（相对应的是Ext.urlDecode解码方法）。 Ext.urlEncode()不能用来处理JSON，Ext.urlEncode()只是负责在HTTP进行GET、POST请求时，将某个&#8220;普通的&#8221; 对象转换成名称/值（name/value）的状态。我这里说&#8220;普通&#8221;的意思是urlEncode只是将第一层属性编码，———数组自然没有问题但内嵌的对象就不行了。 举例： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Ext.urlEncode(obj)&nbsp;==&nbsp;</span><span class="string">"prop1=a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%22'%2C.%3F%2F&amp;prop2=x&amp;prop2=y"</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
* 注意属性3被忽略了 <br />
* 注意特殊字符都被编码了（使用JS自身的encodeURIComponent()）
<p>&nbsp;</p>
<p>如果你只是想纯粹地发送一些的请求，可把参数写成JavaScript原生对象的形式，然后用这个方法编码urlEncode发送，———这是较方便的做法。</p>
<p>例如，你可以在一个GET请求的URL后面加上一段文本字符：</p>
<p>* 请求是这样的: </p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>http:</span><span class="comment">//myurl.com?prop1=a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%22'%2C.%3F%2F&amp;prop2=x&amp;prop2=y </span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
* 服务器会透过URIComponent解码成为：
<p>&nbsp;</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>prop1&nbsp;&nbsp;&nbsp;a0~`!@#$%^&amp;*()-_+={}[]|\:;"',.?/ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>prop2&nbsp;&nbsp;&nbsp;x &nbsp;&nbsp;</span></li>
    <li class="alt"><span>prop2&nbsp;&nbsp;&nbsp;y&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>你也可以同POST请求发送这样的内容：</p>
<p>* 请求是这样的: <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>http:</span><span class="comment">//myurl.com</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>* POST内容： </p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>prop1=a0~%</span><span class="number">60</span><span>!%</span><span class="number">40</span><span>%</span><span class="number">23</span><span>%</span><span class="number">24</span><span>%</span><span class="number">25</span><span>%5E%</span><span class="number">26</span><span>*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%</span><span class="number">22</span><span>'%2C.%3F%2F&amp;prop2=x&amp;prop2=y &nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
* 服务器得到的结果是和GET请求的内容无异的。
<p>&nbsp;</p>
<p>这一切还顺利，但说到要发送和接受JSON，该怎么办呢？接下来再看！ <br />
編輯 使用Ext.encode编码JSON</p>
<p>Ext.encode() （其对应的解码方法为Ext.decode）转换一个复制的对象为一段JSON字符举例：</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Ext.encode(obj)&nbsp;==&nbsp;'{</span><span class="string">"prop1"</span><span>:</span><span class="string">"a0~`!@#$%^&amp;*()-_+={}[]|\\:;\"\',.?/"</span><span>,</span><span class="string">"prop2"</span><span>:[</span><span class="string">"x"</span><span>,</span><span class="string">"y"</span><span>],</span><span class="string">"prop3"</span><span>:{</span><span class="string">"nestedProp1"</span><span>:</span><span class="string">"abc"</span><span>,</span><span class="string">"nestedProp2"</span><span>:</span><span class="number">456</span><span>}}' &nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
* 注意内嵌对象的属性现在被包含进去了
<p>&nbsp;</p>
<p>刚才是我们转换一个简单的对象到名称/值（name/value）的状态，现在的情况将有所不同，此时的对象已经被转换到（序列化）一段参数。具体的作用是，以名称/值（name/value）的形式，发送到服务器解析。如果只是发送一个JSON字符串，可认为这个就是json参数。</p>
<p>要将JSON转换成为可GET/POST适合发送的名称/值（name/value）状态，你可以额外地将其编码： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>encodeURIComponent(Ext.encode(obj))&nbsp;==&nbsp;</span><span class="string">"%7B%22prop1%22%3A%22a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%5C%3A%3B%5C%22'%2C.%3F%2F%22%2C%22prop2%22%3A%5B%22x%22%2C%22y%22%5D%2C%22prop3%22%3A%7B%22nestedProp1%22%3A%22abc%22%2C%22nestedProp2%22%3A456%7D%7D"</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
创建一个GET的请求如下： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="string">"http://url.com?json="</span><span>&nbsp;+&nbsp;encodeURIComponent(Ext.encode(obj)) &nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
或是POST请求也行：
<p>&nbsp;</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="string">"json="</span><span>&nbsp;+&nbsp;encodeURIComponent(Ext.encode(obj))&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>urlEncode()方法也是可以： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>Ext.urlEncode({&nbsp;json:&nbsp;Ext.encode(obj)})&nbsp;==&nbsp;</span><span class="string">"json=%7B%22prop1%22%3A%22a0~%60!%40%23%24%25%5E%26*()-_%2B%3D%7B%7D%5B%5D%7C%5C%5C%3A%3B%5C%22'%2C.%3F%2F%22%2C%22prop2%22%3A%5B%22x%22%2C%22y%22%5D%2C%22prop3%22%3A%7B%22nestedProp1%22%3A%22abc%22%2C%22nestedProp2%22%3A456%7D%7D"</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
这样便可以通过GET/POST发送。至于另一边的服务端，会透过URIComponent解码这段参数：
<p>&nbsp;</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>{</span><span class="string">"prop1"</span><span>:</span><span class="string">"a0~`!@#$%^&amp;*()-_+={}[]|\\:;\"',.?/"</span><span>,</span><span class="string">"prop2"</span><span>:[</span><span class="string">"x"</span><span>,</span><span class="string">"y"</span><span>],</span><span class="string">"prop3"</span><span>:{</span><span class="string">"nestedProp1"</span><span>:</span><span class="string">"abc"</span><span>,</span><span class="string">"nestedProp2"</span><span>:</span><span class="number">456</span><span>}} &nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
来访问JSON已解码的数据。 <br />
編輯 使用Ext.Ajax.request发送JSON
<p>&nbsp;</p>
<p>在EXT 1.1,你可以轻松地使用Ext.Ajax.request()方法来创建一个典型AJAX的请求。该方法允许传入一个配置项的对象，即是可包含其它类型的内容，作为请求的参数的用途，下面引用API的介绍：</p>
<p>（原文）params {Object/String/Function} (Optional) An object containing properties which are used as parameters to the request, a url encoded string or a function to call to get either.</p>
<p>（中文）params {Object/String/Function} (可选项) 包含请求参数的对象，以对象的属性形式出现，一段可url编码的字符串，或者是可返回以上两者的函数。</p>
<p>对于传入的是object类型， Ext.Ajax.request会调用Ext.urlEncode()将其转换为名称/值（name/value）的状态（通常情况忽略内嵌的对象）。</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>var&nbsp;req&nbsp;=&nbsp;Ext.Ajax.request({ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;</span><span class="string">"/ws/search.pl"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;params:&nbsp;obj, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;method:&nbsp;'GET', &nbsp;&nbsp;</span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;disableCaching:&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>})&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>请求是这样的：</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>/ws/search.pl?prop1=a0~%</span><span class="number">60</span><span>!%</span><span class="number">40</span><span>%</span><span class="number">23</span><span>%</span><span class="number">24</span><span>%</span><span class="number">25</span><span>%5E%</span><span class="number">26</span><span>*()-_%2B%3D%7B%7D%5B%5D%7C%5C%3A%3B%</span><span class="number">22</span><span>'%2C.%3F%2F&amp;prop2=x&amp;prop2=y &nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script><br />
服务端解析为：
<p>&nbsp;</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<ol class="dp-j">
    <li class="alt"><span><span>prop1&nbsp;&nbsp;&nbsp;a0~`!@#$%^&amp;*()-_+={}[]|\:;"',.?/ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>prop2&nbsp;&nbsp;&nbsp;x &nbsp;&nbsp;</span></li>
    <li class="alt"><span>prop2&nbsp;&nbsp;&nbsp;y&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>* 如不禁止disableCaching，Ext会加上唯一的_dc参数以消除缓冲。 <br />
* 每次送出的数据都是经过Ext.urlEncode()，很明显是没有发送完整的JSON,只是一连串的名称/值（name/value）的状态。 </p>
<p>如果使用POST的方法，过程也是相同，区别是名称/值（name/value）的状态是放在POST BOBY内发送。</p>
<p>要把JSON发送到服务器，我们需要使用Ext.encode()方法转换数据对象到文本格式的JSON。 Ext.Ajax.request()允许传入一段可URL编码的字符串，所以你既可以用 encodeURIComponent()编码参数，亦可直接是一个简单的对象，让Ext.Ajax.request()为你编码：</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>var&nbsp;req&nbsp;=&nbsp;Ext.Ajax.request({ &nbsp;&nbsp;</span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;url:&nbsp;</span><span class="string">"/ws/search.pl"</span><span>, &nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;params:&nbsp;{json:&nbsp;Ext.encode(obj)}, &nbsp;&nbsp;</span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;disableCaching:&nbsp;</span><span class="keyword">false</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span>})&nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>相类似地，服务端会解析为：</p>
<p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span>{</span><span class="string">"prop1"</span><span>:</span><span class="string">"a0~`!@#$%^&amp;*()-_+={}[]|\\:;\"',.?/"</span><span>,</span><span class="string">"prop2"</span><span>:[</span><span class="string">"x"</span><span>,</span><span class="string">"y"</span><span>],</span><span class="string">"prop3"</span><span>:{</span><span class="string">"nestedProp1"</span><span>:</span><span class="string">"abc"</span><span>,</span><span class="string">"nestedProp2"</span><span>:</span><span class="number">456</span><span>}}&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>这样我们便可以访问JSON已解码的数据了。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/160060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-11-12 22:20 <a href="http://www.blogjava.net/boluobn/articles/160060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>中文化问题(转)</title><link>http://www.blogjava.net/boluobn/articles/160059.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Mon, 12 Nov 2007 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/160059.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/160059.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/160059.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/160059.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/160059.html</trackback:ping><description><![CDATA[<p>这两个问题，解答如下：</p>
<p>1、中文化问题，在 ext-all.js 后面，挂上 ext-lang-zh_CN.js 即可，如： <br />
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-xml">
    <li class="alt"><span><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">"&lt;%=contextPath%&gt;/public/js/ext-base.js"</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">"&lt;%=contextPath%&gt;/public/js/ext-all.js"</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
    <li class="alt"><span class="tag">&lt;</span><span class="tag-name">script</span><span>&nbsp;</span><span class="attribute">type</span><span>=</span><span class="attribute-value">"text/javascript"</span><span>&nbsp;</span><span class="attribute">src</span><span>=</span><span class="attribute-value">"&lt;%=contextPath%&gt;/public/js/ext-lang-zh_CN.js"</span><span class="tag">&gt;</span><span class="tag">&lt;/</span><span class="tag-name">script</span><span class="tag">&gt;</span><span>&nbsp;&nbsp;</span></span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>：</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/160059.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-11-12 22:16 <a href="http://www.blogjava.net/boluobn/articles/160059.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习一下EXT 作了些笔记</title><link>http://www.blogjava.net/boluobn/articles/153683.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Wed, 17 Oct 2007 13:34:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/153683.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/153683.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/153683.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/153683.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/153683.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 文档载入结束 初始化domExt.onReady(function(){&nbsp; &nbsp; &nbsp; &nbsp; //初始化以及应用代码});弹出警告对话框Ext.MessageBox.alert("Warning", "This example is not done and results may vary.");表单&lt;form id="...&nbsp;&nbsp;<a href='http://www.blogjava.net/boluobn/articles/153683.html'>阅读全文</a><img src ="http://www.blogjava.net/boluobn/aggbug/153683.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-10-17 21:34 <a href="http://www.blogjava.net/boluobn/articles/153683.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ext布局类的介绍与使用</title><link>http://www.blogjava.net/boluobn/articles/153680.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Wed, 17 Oct 2007 13:28:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/153680.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/153680.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/153680.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/153680.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/153680.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在WEB应用的开发中，应用界面的布局设计是一项很重要的内容。在EXT中，可以通过BorderLayout与NestedLayoutPanel很方便的设计出各种的布局。本文章的主要内容主要是介绍如何通过BorderLayout、NestedLayoutPanel以及各种面板设计页面布局。&nbsp;&lt;!--[if !supportLists]--&gt;1.&nbsp;&nbsp;&n...&nbsp;&nbsp;<a href='http://www.blogjava.net/boluobn/articles/153680.html'>阅读全文</a><img src ="http://www.blogjava.net/boluobn/aggbug/153680.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-10-17 21:28 <a href="http://www.blogjava.net/boluobn/articles/153680.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>一个用ext做的登录页面</title><link>http://www.blogjava.net/boluobn/articles/153223.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 16 Oct 2007 04:37:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/153223.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/153223.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/153223.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/153223.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/153223.html</trackback:ping><description><![CDATA[<p>最近在关注ext，感觉ext比dodjo的前景好，在网上找到一个用ext做的登录页:http://ondemand.aicproperties.com/</p>
<p><img alt="http://ondemand.aicproperties.com/" src="http://p.blog.csdn.net/images/p_blog_csdn_net/wangjian5748/login.jpg" /></p>
<p>参照这个可以修改出自己想要的登录页面，我就是参照这个页面，修改了系统的登录界面</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/153223.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-10-16 12:37 <a href="http://www.blogjava.net/boluobn/articles/153223.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第一天:EXT简介</title><link>http://www.blogjava.net/boluobn/articles/135061.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:24:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135061.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135061.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135061.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135061.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135061.html</trackback:ping><description><![CDATA[<p>无论你是Ext库的新手，抑或是想了解Ext的人，本篇文章的内容都适合你。本文将简单地介绍Ext的几个基本概念，和如何快速地做出一个动态的页面并运行起来，假设读者已具备了一些JavaScript经验和初级了解HTML Dom。否则的话，请从阅读<a href="http://www.extjs.com/downloads" target=_blank>初学JavaScript资源</a>开始。 </p>
<h2>下载Ext</h2>
<p>如果你未曾下载过，那应从这里下载最新版本的Ext <a href="http://www.extjs.com/downloads" target=_blank>http://extjs.com/downloads</a>。</p>
<p>针对你的下载需求，有几个不同的弹性选项。通常地，最稳定的版本，是较多人的选择。下载解包后，那个example文件夹便是一个探索Ext的好地方！</p>
<h2>开始！</h2>
<p>我们将使用Ext，来完成一些JavaScript任务。</p>
<p>第一步要做的是，下载本教程的<a href="http://www.extjs.com/downloads/tutorial/introduction-ext/IntroToExt.zip" target=_blank>示例文件</a>。Zip文件包括三个文件：<strong>ExtStart.html</strong>, <strong>ExtStart.js</strong>和<strong>ExtStart.css</strong>。解包这三个文件到Ext的安装目录中（例如，Ext是在&#8220;C:\code\Ext\v1.0&#8221;中，那应该在"v1.0"里面新建目录&#8220;tutorial&#8221;。双击<strong>ExtStart.htm</strong>，接着你的浏览器打开启动页面，应该会有一条消息告诉你配置已完毕。如果是一个Javascript错误，请按照页面上的指引操作。</p>
<p>在你常用的IDE中或文本编辑器中，打开ExtStart.js看看：</p>
<p>Ext.onReady可能是你接触的第一个方法。这个方法是指当前DOM加载完毕后，保证页面内的所有元素能被Script引用（reference）。你可删除alert()那行，加入一些实际用途的代码试试：</p>
<pre>Ext.onReady(function() {
alert("Congratulations!  You have Ext configured correctly!");
});
</pre>
<h2>Element：Ext的核心</h2>
<p>大多数的JavaScript操作都需要获取页面上的某个元素（reference）,好让你来做有趣的事情。传统的JavaScript方法，是通过ID获取Dom节点的：</p>
<pre>var myDiv = document.getElementById('myDiv');</pre>
<p>这毫无问题，不过这样单单返回一个对象（DOM节点），用起来并不是太强大和好用。为了要用那节点干点事情，你将会要写不少自定义的代码；另外，对于不同类型浏览器之间的差异，要你处理起来可真头大了。</p>
<p>进入<a href="http://www.extjs.com/deploy/docs/output/Ext.Element.html" target=_blank>Ext.element</a>对象。元素（element）的的确确是Ext的心脏地带，--无论是访问元素（elements）还是完成一些动作，都要涉及它。Element的API是整个Ext库的基础，如果你时间不多，只想了解Ext中的一个类的话，Element一定是首选！</p>
<p>由ID获取一个Ext Element如下（首页ExtStart.htm包含一个div，ID名字为&#8220;myDiv&#8221;，然后，在ExtStart.js中加入下列语句）：</p>
<pre>Ext.onReady(function() {var myDiv = Ext.get('myDiv');});</pre>
<p>再回头看看Element对象，发现什么有趣的东东呢？</p>
<ul>
    <li>Element包含了常见的DOM方法和属性，提供一个快捷的、统一的、跨浏览器的接口（若使用Element.dom的话，就可以直接访问底层DOM的节点。）；
    <li>Element.get()方法内置缓存处理（Cache)，多次访问同一对象效率上有极大优势；
    <li>内置常用的DOM节点的动作，并且是跨浏览器的定位的位置、大小、动画、拖放等等（add/remove CSS classes, add/remove event handlers, positioning, sizing, animation, drag/drop）。 </li>
</ul>
<p>这意味着你可用最小的代码来做各种各样的事情，这里仅仅是一个简单的例子（完整的列表在<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>ElementAPI</a>中）。</p>
<p>继续在ExtStart.js中，在刚才我们获取好myDiv的位置中加入：</p>
<pre>myDiv.highlight();      //黄色高亮显示然后渐退
myDiv.addClass('red');  // 添加自定义CSS类 (在ExtStart.css定义)
myDiv.center();         //在视图中将元素居中
myDiv.setOpacity(.25);  // 使元素半透明
</pre>
<h2>获取多个DOM的节点</h2>
<p>通常情况下，不能由ID获取多个DOM的节点，有可能因为没设置ID,或者你不知道ID,又或者直接用ID方式引用有太多元素了。这种情况下，你会不用ID来作为获取元素的依据，可能会用属性（attribute）或CSS Classname代替。基于以上的原因，Ext引入了一个功能异常强大的Dom Selector库，叫做<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>DomQuery</a>。</p>
<p>DomQuery可作为单独的库使用，但常用于Ext，你可以在上下文环境中（Context）获取多个元素，然后通过Element接口调用。幸运的是，Element对象本身便有<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>Element.selcect</a>的方法来实现查询，即内部调用DomQuery选取元素。这个简单的例子中，ExtStart.htm包含若干段落（</p>
<p>标签），没有一个是有ID的，而你想轻松地通过一次操作马上获取每一段，全体执行它们的动作，可以这样做：</p>
<pre>// 每段高亮显示
Ext.select('p').highlight();
</pre>
<p>DomQuery的选取参数是一段较长的数组，其中包括W3C CSS3 Dom选取器、基本XPath、HTML属性和更多，请参阅<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>DomQuery API文档</a>以了解这功能强大的库的细节。</p>
<h2>响应事件</h2>
<p>到这范例为止，我们所写的代码都是放在onReady中，即当页面加载后总会立即执行，功能较单一——这样的话，你便知道，如何响应某个动作或事件来执行你希望做的事情，做法是，先分配一个function，再定义一个event handler事件处理器来响应。我们由这个简单的范例开始，打开ExtStart.htm，编辑下列的代码：</p>
<pre>Ext.onReady(function() {
Ext.get('myButton').on('click', function(){
alert("You clicked the button");
});
});
</pre>
<p>加载好页面，代码依然会执行，不过区别是，包含alert()的function是已定义好的，但它不会立即地被执行，是分配到按钮的单击事件中。用浅显的文字解释，就是：获取ID为'myDottom'元素的引用，监听任何发生元素被单击的情况，并分配一个function,以准备任何单击元素的情况。</p>
<p>正路来说，Element.select也能做同样的事情，即作用在获取一组元素上。下一例中，演示了页面中的某一段落被单击后，便有弹出窗口：</p>
<pre>Ext.onReady(function() {
Ext.select('p').on('click', function() {
alert("You clicked a paragraph");
});
});
</pre>
<p>这两个例子中，事件处理的function均是简单几句，没有函数的名称，这种类型函数称为&#8220;匿名函数（anonymous function）&#8221;，即是没有名的的函数。你也可以分配一个有名字的event handler,这对于代码的重用或多个事件很有用。下一例等效于上一例：</p>
<pre>Ext.onReady(function() {
var paragraphClicked = function() {
alert("You clicked a paragraph");
}
Ext.select('p').on('click', paragraphClicked);
});
</pre>
<p>到目前为止，我们已经知道如何执行某个动作。但当事件触发时，我们如何得知这个event handler执行时是作用在哪一个特定的元素上呢？要明确这一点非常简单，<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>Element.on</a>方法传入到even handler的function中（我们这里先讨论第一个参数，不过你应该浏览API文档以了解even handler更多的细节）。在我们之前的例子中，function是忽略这些参数的，到这里可有少许的改变，——我们在功能上提供了更深层次的控制。必须先说明的是，这实际上是Ext的事件对象（event object）,一个跨浏览器和拥有更多控制的事件。例如，可以用下列的语句，恢复这个事件的指定的DOM节点：<br></p>
<pre>Ext.onReady(function() {
var paragraphClicked = function(e) {
Ext.get(e.target).highlight();
}
Ext.select('p').on('click', paragraphClicked);
});
</pre>
<p>注意指定的是DOM节点，所以我们首先将其恢复成为适当的元素，然后执行欲完成的事件，这个例子中，我们看见段落是高亮显示的。 </p>
<img src ="http://www.blogjava.net/boluobn/aggbug/135061.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:24 <a href="http://www.blogjava.net/boluobn/articles/135061.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第三天:EXT:Menu组件</title><link>http://www.blogjava.net/boluobn/articles/135058.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135058.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135058.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135058.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135058.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135058.html</trackback:ping><description><![CDATA[<p><label>概述:</label> 讲讲如何使用Ext菜单器件</p>
<p>这篇教程中，我们将学习使用Ext的菜单器件（Menu Widgets)。假设读者已经阅读过Ext简介一文，并懂得一些Ext的基本相关知识。菜单器件是Ext库中较迟实现的器件。它由几个类联合构成，使得创建一个菜单只需若干代码块（Block of code）。</p>
<h2>开始！</h2>
<p>第一步要做的是，下载本教程的<a href="http://www.extjs.com/downloads/tutorial/ext-menu-widget/ext-menu-widget.zip" target=_blank>示例文件</a>。Zip文件包括三个文件：<strong>ExtMenu.html</strong>,、<strong>ExtMenu.js</strong>、<strong>ExtMenu.css、</strong>和<strong>list-items.gif</strong>。解包这四个文件到Ext的安装目录中（例如，Ext是在&#8220;C:\code\Ext\v1.0&#8221;中，那应该在"v1.0"里面新建目录&#8220;menututorial&#8221;。双击<strong>ExtMenu.htm</strong>，接着你的浏览器打开启动页面，应该会有一条消息告诉你配置已完毕。如果是一个Javascript错误，请按照页面上的指引操作。</p>
<p>在你常用的IDE中或文本编辑器中，打开ExtMenu.js看看：</p>
<pre>Ext.onReady(function() {
alert("You have Ext configured correctly! We are now ready to do some Ext Menu Magic!");
});
</pre>
<p>在Ext的介绍中，我们讨论过使用Ext的原因和Ext.onReady()函数的功能。</p>
<h2><br>创建简易的菜单<br></h2>
<p>先看看怎么做一个基本的菜单，然后再讨论代码中的各个组件和知识点。加入下列代码到onReady函数中:</p>
<pre>
var menu = new Ext.menu.Menu({
id: 'basicMenu',
items: [{
text: 'An item',
handler: clickHandler
},
new Ext.menu.Item({
text: 'Another item',
handler: clickHandler
}),
'-',
new Ext.menu.CheckItem({
text: 'A check item',
checkHandler: checkHandler
}),
new Ext.menu.CheckItem({
text: 'Another check item',
checkHandler: checkHandler
})
]
});
var tb = new Ext.Toolbar('toolbar', [{
text:'Our first Menu',
menu: menu  // 分配menu到按钮
}
]);
function clickHandler() {
alert('Clicked on a menu item');
}
function checkHandler() {
alert('Checked a menu item');
}
</pre>
<br>OK 仔细看看这里的代码，首先实例化一个Menu类为变量&#8220;menu&#8221;。然后Menu的构建函数接受一串的Object Literal作为参数，在先前的Ext教程中我们已经讨对ObjectLiteral进行了解。当前的ObjectLiteral就包含了我们菜单中想要的属性。第一个属性是我们分配的ID，稍后我们可用ID来获取Menu的引用。
<p>&nbsp;</p>
<h2><br>各种Item的类型</h2>
<p>属性&#8220;items&#8221;可能是最重要的属性当中的一个。留意一下语法其实我们是将一个数组作为值（value)传到属性中去。数组里的数据就是我们想要在菜单中出现的每一项。每本例中我们放了六个菜单项，但何解每项的语法（Syntax）都不尽相同呢？第一项是一串Object Literal，包含一组我们可配置的name/value。Ext的底层库会为这串Object Literal按其配置默认地创建item对象。接着第二项是Item对象本身，后面跟着分隔符，最后两个是单选框项。整个过程演示了Ext Widget如何动态的运行。下例各项可填入到数组中：</p>
<pre>{text: 'Foo'}                       // Ext 转换这个配置对象到menu item
'Straight Text'                     //文本或原始html (纯文字)
'-'                                 // 创建分隔符
new Ext.menu.Item({text: 'Foo'})    // 创建一个标准item (同{text: 'Foo'})
new Ext.menu.CheckItem()            // 创建单选框item
new Ext.menu.DateItem()             // 创建menu内置的日历控件
new Ext.menu.ColorItem()            //创建一个颜色采集器
new Ext.menu.BaseItem(document.getElementById('my-div')) //允许你加入任何元素
</pre>
<h2>Item属性</h2>
<p>Item接受什么类型的属性呢？本例中我们使用了这两属性：</p>
<pre>text: 'An item',
handler: clickHandler
</pre>
<p>第一个是Item的文本。第二个是当用户单击一单击Item所触发的事件处理函数（event handler function）。本例中我们将函数clickHandler()和checkHandler()定义在代码的最后。作为演示用途，这仅仅是用alert()通知你有一个单击的消息。<br>其它有用的属性是：</p>
<pre>cls: 'a-class-name'  ,       // 为标准Item手动设置样式和图标ICON
icon: 'url',                 // 如不想用CSS,可直接设置图标的URL
group: 'name of group',      //只适用多选项，保证只有一项被选中
</pre>
<p>完整的item属性列表在<a href="http://www.ajaxjs.com/yuicn/article.asp?id=20075196#">Menu Item文档</a>中。</p>
<h2>在UI中摆放菜单</h2>
<p>So,创建好的Menu对象已经有两个基本的item了，然而我们怎么把它们摆放到页面中呢?在UI中一个menu可以分配到多个位置（同一个对象，不同位置多次使用），这正是Ext如此强大的原因：每一个器件（widget）切成&#8220;一块一快&#8221;的类，来构建整个面向对象的动态结构（Structure）。这意味着menu可用于不同的场合。我们可将menu放到有按钮的toolbar中，或用页面中的一个按钮来展开menu，甚至可在Ext的其它器件中（widgets）使用menu作为上下文菜单（Context Menu）。</p>
<p>本例中分配一个menu到toolbar中：</p>
<pre>var tb = new Ext.Toolbar('toolbar', [{
text:'Our first Menu',
menu: menu  // 分配menu到toolbar
}
]);
</pre>
<p>Ext.Toolbar构建函数接受两个参数，第一个是指定toolbar的容器（contrainer）；第二个参数是包含全部按钮的数组。这里,我们只使用一个按钮,正如所见，按钮实质上是一串由数组组成的Object Literal,同时这个Object Litetal亦包含了不同的属性。下面是一组按钮对象的Object Litetal属性：</p>
<pre>cls: 'a-class-name'  ,      //手动设置样式和图标ICON
icon: 'url',                // 如不想用CSS,可直接设置图标的URL
text:'Our first Menu',      // 按钮提示之文字
menu: menu                  // 可以是menu之id或配置对象
</pre>
<h2>Menu的分配方式：</h2>
<p>刚才谈到如何分配Menu到工具条中（toolbar），继而亦讨论menu分配的不同方式，看看有关的细节是怎样的。So,因为menu属性可以以不同方式地分配，即是可以赋予一个menu对象，或是已经建好的menuID，或直接是一个menu config对象。你应该有机会就尝试一下以多种方式创建menu，因为类似的方式方法在Ext的Widgets随处可见。下面的代码演示了如何用不同的方法来做出跟范例一样的效果，唯一相同的就是menu对象的config。菜单中包括两个子菜单、一个DataItem容器、一个ColorItem容器。另外注意event handing函数需两个参数来获取事件更多的信息和知道哪个item被单击了。可以的话，把下面的代码也加入到onReady函数中，亲身体验一下：</p>
<pre>var dateMenu = new Ext.menu.DateMenu({
handler : function(datepicker, date){
alert('Date Selected', 'You chose: '+ date.format('M j, Y'));
}
});
var colorMenu = new Ext.menu.Menu({
id: 'colorMenu', // the menu's id we use later to assign as submenu
items: [
new Ext.menu.ColorItem({
selectHandler: function(colorpicker, color){
alert('Color Selected', 'You chose: ' + color);
}
})
]
});
var tb = new Ext.Toolbar('toolbar', [{
text:'Our first Menu',
menu: {
id: 'basicMenu',
items: [{
text: 'An item',
handler: clickHandler
}, {
text: 'Another item',
handler: clickHandler
},
'-',
new Ext.menu.CheckItem({
text: 'A check item',
checkHandler: checkHandler
}),
new Ext.menu.CheckItem({
text: 'Another check item',
checkHandler: checkHandler
}),
'-', {
text: 'DateMenu as submenu',
menu: dateMenu, // assign the dateMenu we created above by variable reference,
handler: date
}, {
text: 'Submenu with ColorItem',
menu: 'colorMenu'    // we assign the submenu containing a ColorItem using it's id
}
]
}
}
]);
function clickHandler(item, e) {
alert('Clicked on the menu item: ' + item.text);
}
function checkHandler(item, e) {
alert('Checked the item: ' + item.text);
}
</pre>
<p><strong>注意：</strong>留意几种不同的方法加入子菜单！还有even handing函数和Coloritem、DataMenu匿名函数之间的区别。</p>
<h2><br>练一练</h2>
<p>Ok我们用上述的方法，创建了toolbar和menu，看起来应该是这样的：</p>
<img alt="" src="http://www.ajaxjs.com/comm/UserFiles/Image/20070322841.gif">
<p>上文提及menu可摆放在UI的任何位置，这里将为你演示menu如何与Toolbars、MeneuButtons、Context Menus's配合工作，包括一些有用的方法和动态添加的功能。</p>
MenuButton
<pre>new Ext.MenuButton('menubutton', {text:'Menu Button 1', menu: dateMenu});
</pre>
<h2>动态添加菜单按钮到Toolbar</h2>
<p>这条Toolbar有两个按钮。一个分隔符，和一个纯图标的按钮（附Quicktips）。你可尝试这样做，把zip文件中.gif加入 </p>
<pre>Ext.QuickTips.init();
tb.add('-', {
icon: 'list-items.gif', //图标可单行显示
cls: 'x-btn-icon',      // 纯图标
tooltip: '<strong>Quick Tips</strong><br>提示文字'
});
</pre>
<h2>更方便的是</h2>
<p>一些代码片段，有助你提高效率，留意注释！ </p>
<pre>// Menus更多的API内容
// 动态 增、减元素
menu.addSeparator(); //动态加入分隔符
var item = menu.add({
text: 'Dynamically added Item'
});
// items 完整支持Observable API
item.on('click', onItemClick);
// items can easily be looked up
menu.add({
text: 'Disabled Item',
id: 'disableMe'  // &lt;-- 设置ID便于查找lookup
// disabled: true   &lt;-- 先不disabled 而采用下面的方式
});
// 用 id 或 index访问
menu.items.get('disableMe').disable();
</pre>
<h2>下一步是</h2>
<p>现在你已经了解菜单组件是如何工作了。下面的资源有助您进一步更深入学习菜单：</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/135058.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:22 <a href="http://www.blogjava.net/boluobn/articles/135058.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第二天:EXT简介（二）</title><link>http://www.blogjava.net/boluobn/articles/135060.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:22:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135060.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135060.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135060.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135060.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135060.html</trackback:ping><description><![CDATA[<h2>使用Widgets</h2>
(Widget原意为&#8220;小器件&#8221;，现指页面中UI控件)
<p>除了我们已经讨论过的核心JavaScript库，现在的Ext亦包括了一系列的最前端的JavaScirptUI组件库。文本以一个最常用的widget为例子，作简单的介绍。</p>
<h2>MessageBox </h2>
<p>比起略为沉闷的&#8220;HelloWolrd&#8221;消息窗口，我们做少许变化，前面我们写的代码是，单击某个段落便会高亮显示，现在是单击段落，在消息窗口中显示段落内容出来。<br>在上面的paragraphClicked的function中，将这行代码： </p>
<pre>Ext.get(e.target).highlight();
</pre>
<p>替换为：</p>
<pre>var paragraph = Ext.get(e.target);
paragraph.highlight();
Ext.MessageBox.show({
title: 'Paragraph Clicked',
msg: paragraph.dom.innerHTML,
width:400,
buttons: Ext.MessageBox.OK,
animEl: paragraph
});
</pre>
<p>这里有些新的概念讨论一下。在第一行中我们创建了一个局部变量（Local Variable）来保存某个元素的引用，即被单击的那个DOM节点（本例中，我们总是段落paragrah,事因我们已经定义该事件与&lt;p&gt;标签发生关联的了）。为什么要这样做呢？嗯...观察上面的代码，我们需要引用同一元素来高亮显示，在MessageBox中也是引用同一元素作为参数使用。<br>一般来说，多次重复使用同一值（Value）或对象，是一个不好的方式，所以，作为一个好的OOP开发者，应该是将其分配到一个局部变量中，反复使用这变量！</p>
<p>现在，观察MessageBox的调用，准备作为阐述新概念的演示用。乍一看，这像一连串的参数传入到方法中，但仔细看，这是一个非常特别的语法。实际上，传入到MessageBox.show的只有一个参数：一个Object literal,包含一组属性和属性值。在Javascript中，Object Literal是动态的，你可在任何时候用{和}创建一个典型的对象(object)。其中的字符由一系列的name/value组成的属性，属性的格式是[property name]:[property value]。在整个Ext中，你将会经常遇到这种模式的语法，因此你应该消耗掉这知识！<br>使用Object Literal的原因是什么呢？主要的原因是&#8220;韧性（flexibility）"，随时可新增、删除属性，亦可不管顺序地插入。而方法不需要改变。这也是多个参数的情况下，为最终开发者带来不少的方便（本例中的MessageBox.show())。例如，我们说这儿的foo.action方法，有四个参数，而只有一个是你必须传入的。本例中，你想像中的代码可能会是这样的foo.action(null, null, null, 'hello').,若果那方法用Object Literal来写，却是这样， foo.action({ param4: 'hello' })，这更易用和易读。</p>
<h2>Gird </h2>
<p>Gird是Ext中人们最想先睹为快的Widgets之一，也是最流行之一。好，让我们看看怎么轻松地创建一个Gird并运行。用下列代码替换ExtStart.js中全部语句：</p>
<pre>Ext.onReady(function() {
var myData = [
['Apple',29.89,0.24,0.81,'9/1 12:00am'],
['Ext',83.81,0.28,0.34,'9/12 12:00am'],
['Google',71.72,0.02,0.03,'10/1 12:00am'],
['Microsoft',52.55,0.01,0.02,'7/4 12:00am'],
['Yahoo!',29.01,0.42,1.47,'5/22 12:00am']
];
var ds = new Ext.data.Store({
proxy: new Ext.data.MemoryProxy(myData),
reader: new Ext.data.ArrayReader({id: 0}, [
{name: 'company'},
{name: 'price', type: 'float'},
{name: 'change', type: 'float'},
{name: 'pctChange', type: 'float'},
{name: 'lastChange', type: 'date', dateFormat: 'n/j h:ia'}
])
});
ds.load();
var colModel = new Ext.grid.ColumnModel([
{header: "Company", width: 120, sortable: true, dataIndex: 'company'},
{header: "Price", width: 90, sortable: true, dataIndex: 'price'},
{header: "Change", width: 90, sortable: true, dataIndex: 'change'},
{header: "% Change", width: 90, sortable: true, dataIndex: 'pctChange'},
{header: "Last Updated", width: 120, sortable: true,
renderer: Ext.util.Format.dateRenderer('m/d/Y'), dataIndex: 'lastChange'}
]);
var grid = new Ext.grid.Grid('grid-example', {ds: ds, cm: colModel});
grid.render();
grid.getSelectionModel().selectFirstRow();
});
</pre>
<p>这看上去很复杂，但实际上加起来，只有七行代码。第一行创建数组并作为数据源。实际案例中，你很可能从数据库、或者WebService那里得到动态的数据。接着，我们创建并加载data store， data store将会告诉Ext的底层库接手处理和格式化这些数据。接着，我们定义一个column模型，用来轻松地调配Gird的每一列参数。最后我们生成这个Gird,传入data store和column模型两个对象，进行渲染并选好第一行。不是太困难吧？如果一切顺利，搞掂之后你会看到像这样的： <br></p>
<img alt="" src="http://www.ajaxjs.com/comm/UserFiles/Image/20070322731.gif">
<p>当然，你可能对这段代码的某些细节，并不完全掌握其中的含义（像MemoryProxy究竟是什么？）但先不要紧，这个例子的目的是告诉你，用少量的代码，创建一个富界面的多功能的UI组件而已——这是完全可能的，更多细节的内容，留给读者你自己学习吧。这儿有许多学习Grid的资源。<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>Ext Grid教程</a>、<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>交叉Gird演示</a>和<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>Gird API文档</a>。 </p>
<h2>还有更多的..</h2>
<p>这只是冰山一角。还有一打的UI Widgets可以供调用，如 layouts, tabs, menus, toolbars, dialogs, tree view等等。请参阅API文档中<a href="http://www.ajaxjs.com/yuicn/article.asp?id=20072736#">范例演示</a>。 </p>
<h2>使用Ajax</h2>
<p>在弄好一些页面后，你已经懂得在页面和脚本之间的控制原理（interact）。接下来，你想知道的是，怎样与后台服务器（remote server）交换数据，常见的是从数据库加载数据（load）或是保存数据（save）到数据库中。通过JavaScript异步无刷新交换数据的这种方式，就是所谓的Ajax。Ext内建卓越的Ajax支持，例如，一个普遍的用户操作就是，异步发送一些东西到服务器，然后，UI元素根据回应（Response）作出更新。这是一个包含text input的表单，一个div用于显示消息（注意，你可以在ExtStart.html中加入下列代码，但这必须要访问服务器）：</p>
<pre>&lt;div id="msg" style="visibility: hidden"&gt;&lt;/div&gt;
Name: &lt;input type="text" id="name" /&gt;&lt;br /&gt;
&lt;input type="button" id="oKButton" value="OK" /&gt;</pre>
<p>接着，我们加入这些处理交换数据的JavaScript代码到文件ExtStart.js中(用下面的代码覆盖)：</p>
<pre>Ext.onReady(function(){
Ext.get('oKButton').on('click', function(){
var msg = Ext.get("msg");
msg.load({
url: [server url], //换成你的URL
params: "name=" + Ext.get('name').dom.value,
text: "Updating..."
});
msg.show();
});
});</pre>
<p>这种模式看起来已经比较熟悉了吧！先获取按钮元素，加入单击事件的监听。在事件处理器中（event handler），我们使用一个负责处理Ajax请求、接受响应（Response）和更新另一个元素的Ext内建类，称作<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>UpdateManager</a>。UpdateManager可以直接使用，或者和我们现在的做法一样，通过Element的load方法来访问（本例中该元素是&#8220;msg&#8220;的div）。当使用<a href="http://www.extjs.com/tutorial/introduction-ext#" target=_blank>Element.load</a>方法，请求（request)会被加工处理后发送，等待服务器的响应（Response），来自动替换元素的innerHTML。简单传入服务器url地址，加上字符串参数，便可以处理这个请求（本例中，参数值来自&#8220;name&#8221;元素的value),而text值就是请求发送时提示的文本，完毕后显示那个msg的div（因为开始时默认隐藏）。当然，和大多数Ext组件一样，UpdateManager有许多的参数可选，不同的Ajax请求有不同的方案。而这里仅演示最简单的那种。</p>
<fieldset><legend>PHP</legend>
<pre>&lt;? if(isset($_GET['name'])) {<br>		echo 'From Server: '.$_GET['name'];<br>	}<br>?&gt;</pre>
</fieldset>
<fieldset><legend>ASP.Net</legend>
<pre>protected void Page_Load(object sender, EventArgs e)<br>{<br>	if (Request["name"] != null)<br>	{<br>		Response.Write("From Server: " + Request["name"]);<br>		Response.End();<br>	}<br>}</pre>
</fieldset>
<fieldset><legend>Cold Fusion </legend>
<pre>&lt;cfif StructKeyExists(url, "name")&gt;<br>	&lt;cfoutput&gt;From Server: #url.name#&lt;/cfoutput&gt;<br>&lt;/cfif&gt;
</pre>
</fieldset>
<p>最后一个关于Ajax的谜题就是，服务器实际处理请求和返回（Resposne）的具体过程。这个过程会是一个服务端页面，一个Servlet，一个Http处理器，一个WebService,甚至是Perl或CGI脚本，即任何一个服务器都可以处理http请求。无法预料的是，服务器返回什么是服务器的事情，无法给一个标准的例子来覆盖所有的可能性。(这段代码输出刚才我们传入'name'的那个值到客户端，即发送什么，返回什么）。</p>
<p>使用Ajax的真正挑战，是需经过适当处理过的手工代码，并相应格式化为服务端可用接受的数据结构。有几种格式供人们选择（最常用为JSON/XML)。正因Ext是一种与服务器中立的语言，使得其它特定语言的库亦可用于Ext处理Ajax服务。只要页面接受到结果是合适的数据格式，Ext绝不会过问服务器的事情！要全面讨论这个问题，已超出本文的范围。推荐正在使用Ajax的您，深入阅读<a href="http://www.ajaxjs.com/yuicn/article.asp?id=20072736#" target=_blank>Ext Ajax教程</a>。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/135060.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:22 <a href="http://www.blogjava.net/boluobn/articles/135060.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第五日--Grid组件的简易分页</title><link>http://www.blogjava.net/boluobn/articles/135056.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135056.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135056.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135056.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135056.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135056.html</trackback:ping><description><![CDATA[<h2>教程：Grid组件的简易分页</h2>
<p><label>概述:</label> 本例将会带你进入Grid分页的世界</p>
<p>原文作者：Shea Frederick <a href="http://www.extjs.com/tutorial/basics-paging-grid-component" target=_blank>出处</a> </p>
<p>参考图：<br><a href="http://www.ajaxjs.com/yuicn/demos/teach.gif" target=_blank></a></p>
<p>读者应先下载本例涉及的<a href="http://www.ajaxjs.com/yuicn/tranlate/grid-paging.zip" target=_blank>示范代码</a>。这里是一个已经完成好的<a href="http://www.vinylfox.com/extjs/examples/grid-paging/grid-paging-working.php" target=_blank>例子</a>。</p>
<h2>Gird数据</h2>
<p>Grid的分页必须依靠服务端（Server Side）来划分好每一页的数据才可以完成。 </p>
<p>本例中的服务端语言是PHP,数据库是MySQL，用来导出一些随机的数据。下列脚本的作用是，获取我们想要的数据，同时这些数据是已分好页的数据。分页的参数是由Page Toolbar传入的变量limit和start所决定的。 </p>
<pre><code>
$link = mysql_pconnect("test-db.vinylfox.com", "test", "testuser")
or die("Could not connect");
mysql_select_db("test") or die("Could not select database");
$sql_count = "SELECT id, name, title, hire_date, active FROM random_employee_data";
$sql = $sql_count . " LIMIT ".$_GET['start'].", ".$_GET['limit'];
$rs_count = mysql_query($sql_count);
$rows = mysql_num_rows($rs_count);
$rs = mysql_query($sql);
while($obj = mysql_fetch_object($rs))
{
$arr[] = $obj;
}
Echo $_GET['callback'].'({"total":"'.$rows.'","results":'.json_encode($arr).'})';
</code>
</pre>
<p>由于每个后台开发的环境都不尽相同，所以这里的服务端代码就不细究了。</p>
<h2>怎么做一个分页的Grid</h2>
<p>本例采用的是<em>ScriptTagProxy</em>，原因是 范例代码 和 服务端代码 不是在同一个服务器上（译注：即&#8220;跨域&#8221;），而大多数的情况是，在同一个服务器上得到数据，直接用HttpProxy就可以了。</p>
<p>使用DataStore与平时唯一不同的地方，便是需要设置<em>totalProerty</em>属性。本例中，我们从服务端的脚本计算出&#8220;total&#8221;这个值，告诉DataStore总共有多少个记录，这里指的是所有的记录数。</p>
<pre><code>
var ds = new Ext.data.Store({
proxy: new Ext.data.ScriptTagProxy({
url: 'http://www.vinylfox.com/yui-ext/examples/grid-paging/grid-paging-data.php'
}),
reader: new Ext.data.JsonReader({
root: 'results',
totalProperty: 'total',
id: 'id'
}, [
{name: 'employee_name', mapping: 'name'},
{name: 'job_title', mapping: 'title'},
{name: 'hire_date', mapping: 'hire_date', type: 'date', dateFormat: 'm-d-Y'},
{name: 'is_active', mapping: 'active'}
])
});
</code>
</pre>
<h2>分页栏Toolbar</h2>
<p>这里加入一个分页栏到Grid的面板中，--差不多完成喽。</p>
<pre><code>
var gridFoot = grid.getView().getFooterPanel(true);
var paging = new Ext.PagingToolbar(gridFoot, ds, {
pageSize: 25,
displayInfo: true,
displayMsg: 'Displaying results {0} - {1} of {2}',
emptyMsg: "No results to display"
});
</code>
</pre>
<p>最后传入<em>start</em>和<em>limit</em>参数以初始化数据。</p>
<pre><code>
ds.load({params:{start:0, limit:25}});
</code>
</pre>
<p>花时间较多的地方是，在后台如何生成数据，以配合Grid的运作，一旦这些工作OK后，分页Grid再不是一件难事了。</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/135056.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:21 <a href="http://www.blogjava.net/boluobn/articles/135056.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第四天--开始使用Grid</title><link>http://www.blogjava.net/boluobn/articles/135057.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:21:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135057.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135057.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135057.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135057.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135057.html</trackback:ping><description><![CDATA[<p><label>概述:</label> 本教程将以XML为数据源，带你进入Grid的世界。</p>
<p>本文涉及的范例代码，可以在这里下载。一个完成好的例子可在这里找到。</p>
<h3>步骤一 定义数据(Data Definition)</h3>
<p>首先要让Grid知道XML文档定义了每一行是什么数据。正如所见，我们命名了"item"在下面的XML样本中。</p>
<h4><strong>单行的XML样本数据</strong> </h4>
<pre>&lt;Item&gt;
&lt;ASIN&gt;0446613657&lt;/ASIN&gt;
&lt;DetailPageURL&gt;http://www.amazon[*SNIP*]JVQEG2&lt;/DetailPageURL&gt;
&lt;ItemAttributes&gt;
&lt;Author&gt;Sidney Sheldon&lt;/Author&gt;
&lt;Manufacturer&gt;Warner Books&lt;/Manufacturer&gt;
&lt;ProductGroup&gt;Book&lt;/ProductGroup&gt;
&lt;Title&gt;Are You Afraid of the Dark?&lt;/Title&gt;
&lt;/ItemAttributes&gt;
&lt;/Item&gt;
</pre>
<p>接着需要定义某一列为&#8220;统一标识（Unique Identifier）&#8221;,即ID,根据&#8220;id"所设置的那个节点来读取值（样本代码第九行）。本例中的样本数据是&#8221;ASIN"列。</p>
<p>数据定义的最后部分就是指定你需要显示的字段(Fields),把这些字段放到一个数组之中，并保证这些字段与你的XML数据中元素名称是一致的，而且还要注意先后顺序，这里的顺序不需要和XML文件中顺序一致。</p>
<pre>    var dataStore = new Ext.data.Store({
proxy: new Ext.data.HttpProxy({url: 'sampledata-sheldon.xml'}),
reader: new Ext.data.XmlReader({
record: 'Item',
id: 'ASIN'
}, [
'Author', 'Title', 'Manufacturer', 'ProductGroup'
])
});
<p>&nbsp;</p>
</pre>
<p>&nbsp;</p>
<h3>步骤二 列模型（Column Model）</h3>
<p>下一步便是定义Column Model 列模型。简单地说，就是通过一些属性的设置，决定每一列怎么控制或怎么显示，这是一个由每列的配置参数组成的数组。注意，出现的顺序应该与刚才定义&#8220;字段&#8221;的数组一致。较常见的参数通常是header和width，所以你会觉得这两项是必须要设置的，然而宽度（width）其实不总是需要的，因为稍后我们将使用autoWidth/Height来代替。</p>
<h4><strong>列模型样本</strong> </h4>
<pre>	var colModel = new Ext.grid.ColumnModel([
{header: "Author", width: 120, dataIndex: 'Author'},
{header: "Title", width: 180, dataIndex: 'Title'},
{header: "Manufacturer", width: 115, dataIndex: 'Manufacturer'},
{header: "Product Group", width: 100, dataIndex: 'ProductGroup'}
]);
</pre>
<p>最后是将DataStore和Column Model两样东西传入到Grid，渲染结果，然后加载来自DataStore的数据，这些就是你让Grid工作起来的所有因素！</p>
<h4><strong>进行渲染！</strong> </h4>
<pre>    var grid = new Ext.grid.Grid('mygrid', {
ds: dataStore,
cm: colModel
});
grid.render();
dataStore.load();
</pre>
<img src ="http://www.blogjava.net/boluobn/aggbug/135057.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:21 <a href="http://www.blogjava.net/boluobn/articles/135057.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第六天--关于树TreePanel(Part 1)</title><link>http://www.blogjava.net/boluobn/articles/135054.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 12:19:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/135054.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/135054.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/135054.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/135054.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/135054.html</trackback:ping><description><![CDATA[树组件是YUI.Ext 0.40 新增的组件。虽然YUI已经自带有TREE VIEW的组件，但JACK还是决定重新开发。具体原因在<a href="http://www.ajaxjs.com/yuicn/article.asp?id=20070245" target=_blank>http://www.ajaxjs.com/yuicn/article.asp?id=20070245</a>（翻译文章）或<span id=mark-0 title="66 comments" contentindex="0"><a href="http://www.jackslocum.com/blog/2006/12/29/preview-drag-and-drop-enhancements-and-the-new-treepanel/" target=_blank>http://www.jackslocum.com/blog/2006/12/29/preview-drag-and-drop-enhancements-and-the-new-treepanel/</a></span> （原文）
<p>一、加载一个同步Tree:</p>
<p>
<style type=text/css>
pre { border:1px solid #CCCCCC; border-left:3px; padding:8px; font-size:9pt; font-family:"Segoe UI", Verdana}</style>
</p>
<div>
<pre>
<p>var TreeTest = function(){<br>
var Tree = YAHOO.ext.tree;// 快捷方式<br>
<br>
return {<br>
init : function(){<br>
var tree = new Tree.TreePanel('tree_div', {//需要一个tree_div的holder<br>
animate:true, //是否动画<br>
loader: new Tree.TreeLoader({dataUrl:'get_nodes.asp'}), //调用一个JSON<br>
enableDD:false,// 是否支持拖放<br>
containerScroll: true<br>
});<br>
<br>
// 设置根节点<br>
var root = new Tree.AsyncTreeNode({<br>
text: 'Frank的作品',  //根节点文字<br>
draggable:false, //根节点是否可拖放<br>
id:'source'<br>
});<br>
tree.setRootNode(root);
// 渲染 tree<br>
tree.render(false,false);<br>
// false for not recursive (the default), false to disable animation<br>
root.expand(false,false);<br>
}<br>
};<br>
}();
</p>
<p>YAHOO.ext.EventManager.onDocumentReady(TreeTest.init, TreeTest, true);</p>
</pre>
</div>
<p>通过XHR调用这个get_nodes.asp文件，假设服务器返回这样一个JSON(有关JSON的介绍:<a href="http://www.json.org/json-zh.html" target=_blank>http://www.json.org/json-zh.html</a>)：</p>
<pre>[{
"text":"yui-ext.js","id":"\/yui-ext.js","leaf":true,"cls":"file"
} ,{
"text":"yui-ext-1118.php","id":"\/yui-ext-1118.php","leaf":true,"cls":"file"
} ,{
"text":"yui-ext-1228.php","id":"\/yui-ext-1228.php","leaf":true,"cls":"file"
} ,{
"text":"build","id":"\/build","cls":"folder"
} ,{
"text":"source","id":"\/source","cls":"folder"
} ,{
"text":"yui-ext-1123.php","id":"\/yui-ext-1123.php","leaf":true,"cls":"file"
} ,{
"text":"yui-ext-1203.php","id":"\/yui-ext-1203.php","leaf":true,"cls":"file"
} ]
</pre>
Server端JSON的输出（ASP JScript）
<pre>
var goods = new dbOpen();
goods.GetSQL ="select * from goodsbigclass";
with(goods){
GetRS(1);
var str="";
str+="[";
do{
str+='{"text":"'+rs("BigClassName")+'","id":"\/yui-ext.js","leaf":true,"cls":"file","href":"?b_id='+rs("BigClassID")+'"},';
rs.MoveNext();
}while(!rs.EOF);
str+="]";
Response.Write(str);
Close();
}
goods= null;
</pre>
<p>解释：<br>&#8220;text&#8221;--&gt;显示的文本<br>"id"--&gt;id值 <br>&#8220;leaf&#8221;--&gt;Boolean值，如果&#8220;叶子&#8221;是真的话，则不能包含子节点Children nodes <br>"cls"--&gt;选用的样式，通常在这里选定图标<br>&#8221;href&#8220;--&gt;指定的url，还有一个&#8221;hrefTarget&#8220;的属性<br>另外，除了以上的属性，您还可以在JSON加入任何的属性，作为节点的属性，见Jack原话：<br>The href attribute is called "href", there's also an "hrefTarget" attribute. For capturing node clicks, you can listen on individual nodes or you can listen for "click" on the tree which will pass you the node that was clicked. FYI, you can put any attributes you want in the json config for the node and it will be available as node.attributes. FAQ.4会继续解释这个问题。<br>FQA常见问题：</p>
<p>1.Tree支持XML数据交换吗？<br>A:暂不支持，据FOURM上的话，以后会提供支持，见：<br>can I use xml instead of json for sending nodes hirerachy ？<br>Correct me if I'm wrong but I think the answer is no here. But that doesn't mean it won't be supported later on. </p>
<p>2.我想用单击代替双击展开子节点，可以吗？<br>A:可以，见： </p>
<pre>tree.on('click', function(node){
if(!node.isLeaf()){
node.toggle();
}
});</pre>
<p>&nbsp;</p>
<p>3.事件处理的几种情形：<br>A: a.当加入某个节点时，为其增加事件 </p>
<pre>
tree.on('append', function(tree, node){
if(node.id == 'foo'){
// 这里加入你的事件（如click）侦听器（addListener()）
}
});</pre>
<p>b.针对某个节点的单击事件 </p>
<pre>
tree.on('click', function(node){
if(node.id == 'foo'){
// do something
}
});</pre>
<p>c.针对某个区域（集合）的事件 </p>
<pre>
// fires any time the selection in the tree changes
tree.getSelectionModel().on('selectionchange', function(sm, node){
if(node &amp;&amp; node.id == 'foo'){
// do something
}
});</pre>
<p>&nbsp;</p>
<p>4.如何获取JSON中的自定义字段（或称作参数 parameters）<br>A:JSON对象已经被构建函数 construction传递到TreeNode中，作为node.attributes 出现，所以调用属性node.attributes 便可获取。详见：<a href="http://www.yui-ext.com/forum/viewtopic.php?t=2253">http://www.yui-ext.com/forum/viewtopic.php?t=2253 </a></p>
<pre>tree.on('click', function(node){
if(!node.isLeaf()){
node.toggle();
}
});</pre>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/135054.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 20:19 <a href="http://www.blogjava.net/boluobn/articles/135054.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第六天--关于树TreePanel(Part 2异步获取节点)</title><link>http://www.blogjava.net/boluobn/articles/134999.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 08:44:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134999.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134999.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134999.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134999.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134999.html</trackback:ping><description><![CDATA[<div style="PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px">
<p>下面将介绍如何异步取一棵树的所有节点，具体做法与官方同步取节点有很大不同，尤其在json的id属性上，下面是我一些摸索，可能不是最佳方案，有待大家一起研究。</p>
<p>异步取节点的思路是这样的：<br>1、先定义一个初始化节点（也可以不定义，看个人需求）<br>2、yui-ext根据该节点id请求服务器，获得子节点各属性<br>3、循环<br><br><strong>特点</strong>：可以在上一级目录中，在服务器端预先将该节点是否有子节点读好（json中的isLeaf属性），虽然但数据库将多承担一些压力，但用个count(*)不会造成太大负担（除非查询条件异常复杂），也可以不读，即把所有isLeaf设置为false。<br><br><br><strong>问题：</strong><br>1、目前还无法进行reload，即每次打开节点都重新读取一次<br>2、样式还有些问题，无法通过node. childNodes[i]设置子节点的style，所以无法改变最后一级元素的style（也许是通过别的途径改变style的？）</p>
<p>&nbsp;</p>
<p><strong>示例：</strong><br>先给出一段js代码，可以结合官方的demo（<a href="http://yui-ext.com/playpen/yui-ext.0.40/examples/tree/reorder.html" target=_blank><u><font color=#0000ff>http://yui-ext.com/playpen/yui-ext.0.40/examples/tree/reorder.html</font></u></a>）看看：</p>
<pre>//定义根id的变量
var rootId = 1;
var TreeTest = function(){
// shorthand
var Tree = YAHOO.ext.tree;
return {
init : function(userName){
var tree = new Tree.TreePanel('detailTree', {
animate:true,
//这个dataUrl是初始化树所用的url，你也可以不写或定义一个静态json文件，还可以什么都不写全部依赖于第二个url自动产生，视具体需求而定
loader: new Tree.TreeLoader({dataUrl:'calendarDetail.do?method=getDayDetailJSON&amp;parentId='+rootId}),
enableDD:true,
containerScroll: true
});
// set the root node
var root = new Tree.AsyncTreeNode({
text: 'yui-ext',
draggable:false,
id:rootId
});
tree.setRootNode(root);
//根据当前节点id，动态拼出请求服务器的路径
//每产生一个节点，指向一个事件的引用，将新建loader.dataUrl（具体事件的机制还需要再研究）
//注意调用函数是beforeload
tree.on('beforeload', function(node){
tree.loader.dataUrl = 'calendarDetail.do?method=getDayDetailJSON&amp;parentId='+node.id;
});
//这里演示一个自定义json的用法(description为自定义json的key)
//以及如何定义某节点的style(node.ui.textNode.style.title)
//具体可以看ui这个类
tree.on('beforeexpand', function(node){
node.ui.textNode.style.title = &#8216;red&#8217;;
alert(node.attributes.description);
});
// render the tree
tree.render();
// false for not recursive (the default), false to disable animation
root.expand();
}
};
}();
</pre>
<p>同时再分析一个json：<br>[{"text":"衣服类",&nbsp; <br>"id":"5",&nbsp;&nbsp;&nbsp;&nbsp; //注意：这里是该节点的id，拼连接时要用到，与官方的json有所不同 <br>"leaf":true,<br>"cls":"file",<br>"description":"这里是衣服类"}]&nbsp;&nbsp; //自定义只需要这样就可以了 </p>
<p>给出java产生json的代码逻辑片断： </p>
<p>&nbsp;</p>
<pre>&#8230;&#8230;
//list为由传入的id所求的category集合
List<costcategory> list=
findBy("parentId", new Long(parentId.toString()));
StringBuffer JSONStr = new StringBuffer();  //声明json
JSONStr.append("[");
for(CostCategory i : list){
boolean isLeaf = isLeaf(i.getId());  //isLeaf()为判断是否有以该id为parentId的节点，具体没有给出
String icon = isLeaf?"file":"folder";
String description = i.getCategoryDescription()==null?"":i.getCategoryDescription();
//{"text":"treedata.jsp","id":"treedata.jsp","leaf":true,"cls":"file"},
JSONStr.append("{\"text\":\""+
i.getCategoryName()+"\",\"id\":\""+
i.getId()+"\",\"leaf\":"+
isLeaf+",\"cls\":\""+
icon+"\",\"description\":\""+
description+"\"},");
}
JSONStr.deleteCharAt(JSONStr.lastIndexOf(","));
JSONStr.append("]");
System.out.println(JSONStr);
out.print(JSONStr);   //输出json
&#8230;&#8230;
</pre>
</div>
<img src ="http://www.blogjava.net/boluobn/aggbug/134999.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 16:44 <a href="http://www.blogjava.net/boluobn/articles/134999.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第七天--关于View&amp;JSONView</title><link>http://www.blogjava.net/boluobn/articles/134960.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:29:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134960.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134960.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134960.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134960.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134960.html</trackback:ping><description><![CDATA[<p>展现一条一条的二维关系的数据，我们可以使用GIRD组件。 但有些场合，如产品展示，画册，我们可以使用View组件，来展示&#8220;矩阵&#8221;式的数据。 View的数据源来自DataModel对象，即包含XMLDataModel和JSONDataModel。尽管View支持JSON,但如果不是用于DataModel，View的子类JSONView更适用，因为它提供更多的事件和方法。一般来说，View用于XML数据源；JSONView用于JSON数据源。</p>
<p>View如何工作？</p>
<p>记得以前如何输出一个记录吗？以网上商店为例子；以前是这样输出一个商品的： </p>
<p>&lt;%<br>&nbsp;&nbsp;.....<br>&nbsp;&nbsp;//下列服务端代码为ASP using JScript（依然是JS，I'm a big JS Fan^^）<br>&nbsp;&nbsp;var str ="";<br>&nbsp;&nbsp;str+="&lt;td&gt;&lt;div id='title'&gt;";<br>&nbsp;&nbsp;str+=rs("title")+"&lt;\/div&gt;";<br>&nbsp;&nbsp;str+="&lt;img src="+rs("thumb_image")+"&gt;";<br>&nbsp;&nbsp;str+="&lt;\/td&gt;"<br>&nbsp;&nbsp;Resposne.Write(str);<br>&nbsp;&nbsp;.....<br>%&gt;<br>很明显，我们最终目的还是要输出HTML,为浏览器渲染(Render)服务。View工作原理也一样，只不过把以前Sever做的事情搬到Cilent来，依靠View来处理（实质上是Domhelper的模版），让浏览器最终渲染输出。</p>
<p>需要你的帮忙：Domhelper</p>
<p>如上述，View的工作离不开DomHelpr。DomHelpr在这里提供"模版Template",并将其编译。见下面代码： </p>
<p>//新建一个Template对象<br>var tpl = new YAHOO.ext.Template(&nbsp;&nbsp;&nbsp; '&lt;div class="entry"&gt;' +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;a class="entry-title" href="{link}"&gt;{title}&lt;/a&gt;' +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;h4&gt;{date} by {author} | {comments} Comments&lt;/h4&gt;{description}' +&nbsp;&nbsp;&nbsp; '&lt;/div&gt;&lt;hr /&gt;');<br>tpl.compile(); //compile()的方法，可带来DOM性能的增益<br>var moreView = new YAHOO.ext.JsonView('entry-list', tpl, {<br>&nbsp;&nbsp; jsonRoot: 'posts'<br>});<br>//又或者隐式创建Template对象<br>var view = new YAHOO.ext.View('my-element', <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '&lt;div id="{0}"&gt;{2} - {1}&lt;/div&gt;', // auto create template<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; dataModel, { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; singleSelect: true, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; selectedClass: 'ydataview-selected'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });</p>
<p><br>&nbsp;</p>
<p>加载数据</p>
<p>VIEW加载数据的方式与JSONView的有所不同：VIEW采用DataModel的load(),JSONView采用UpateManager的load()。下面重点说说JSONView的load()方法： </p>
<p>&nbsp;view.load({ url: 'your-url.php', params: {param1: 'foo', param2: 'bar'}, // 可以是URL encoded字符 callback: yourFunction, scope: yourObject, //(optional scope)&nbsp; discardUrl: false,&nbsp; nocache: false, text: 'Loading...',//loading之提示文字 timeout: 30,//超时 scripts: false }); <br>只有url参数是不可缺省的，其它如 nocache, text and scripts都是可选的。 text和scripts是与UpdateManger实例关联的参数 </p>
<p>params : String/Object <br>(optional) The parameters to pass as either a url encoded string "param1=1&amp;param2=2" or an object {param1: 1, param2: 2}<br>callback : Function <br>(optional) Callback when transaction is complete - called with signature (oElement, bSuccess)<br>discardUrl : Boolean <br>(optional) By default when you execute an update the defaultUrl is changed to the last used url. If true, it will not store the url.<br>JSONView使用点滴</p>
<p>a.有一个gird和JSONView,两者如何同时调用一个数据源？<br>1.改变jsonData属性; 2.Call refresh(); 见<a href="http://www.yui-ext.com/forum/viewtopic.php?t=1968">http://www.yui-ext.com/forum/viewtopic.php?t=1968</a></p>
<p>b.分页<br>分页视乎还没有什么好的方案，JACK只提供下面的思路：<br>JsonView extends View. View supports using a JSONDataModel. It won't render a paging toolbar for you, but it will loadPage() and standard DataModel functionality. The view will automatically update when you load new data. If you want named template parameters (like JsonView), you will need to remap the indexes (DataModel style) to named parameters. See the YAHOO.ext.View docs for more info on that.<br><a href="http://www.yui-ext.com/forum/viewtopic.php?t=2340">http://www.yui-ext.com/forum/viewtopic.php?t=2340</a></p>
<p>c.如何JSONView的获取整个DataModel而不是字段？我每次用alert(mainView.jsonData); 结果是&#8220;undefined&#8221; <br>如果是获取DataModel，那应该用View对象。出现undefined的原因是load()是异步的，你必须先等待数据load完。如：</p>
<p>mainView.el.getUpdateManager().on('update', function(){ <br>&nbsp;&nbsp;&nbsp;&nbsp; alert(mainView.jsonData); <br>});<br>详见<a href="http://www.yui-ext.com/forum/viewtopic.php?t=1209">http://www.yui-ext.com/forum/viewtopic.php?t=1209</a></p>
<p>&nbsp;</p>
<p>d.学习例子。范例Image Chooser本身就是一个好的学习例子</p>
<p>JSON Format<br>您可能认为服务输出这样的JSON：</p>
<p>{"user": {"username": "Bob", "birthday": "1976-11-08", "join_date": "2006-08-01", "last_login": "2006-12-03"}} <br>是正确无误的。但不对，它是不能被处理的。正确的格式应该是：</p>
<p>{"user": [{"username": "Bob", "birthday": "1976-11-08", "join_date": "2006-08-01", "last_login": "2006-12-03"}]} <br>注意方括号内声明的是数组类型，View渲染方式实际是与DataModel一致的</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134960.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:29 <a href="http://www.blogjava.net/boluobn/articles/134960.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第七日B-View&amp;JSONView 一个画室网站的案例</title><link>http://www.blogjava.net/boluobn/articles/134959.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:27:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134959.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134959.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134959.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134959.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134959.html</trackback:ping><description><![CDATA[<p>之前在Part 1简单介绍了Veiw和JSONView。今天这里小弟为大家说说应用的案例，原本Jack的Image Chooser是一个非常好的案例，当中包含Jack大量的技巧，不过正因为这样，过于深奥，小弟我亦不能一时全盘吃透，只挑其&#8220;精妙&#8221;之处，与君共勉之！<br>本文包含四大知识点：1.在LayoutDialog中加入Tabs；2.View的使用方式；3.JSONView的使用方式;4.获取XML/JSON的fields值与分页</p>
<p>演示地址</p>
<p>【View之定义】<br>&nbsp; A View is generally used to build a quick template-based display of datamodel, rather than building a more complex grid. I thnk there's a blog post that illustrates doing this with JSON data. Templates can be used for any repetitious html creation, not necessarily tied to a datamodel.<br>主要的意思是View用于展示DataModel的数据，Part 1已经说过。这里是来自fourm某君的补充。</p>
<p>代码点评：</p>
<p>1.先看一段简单的</p>
<p>&nbsp;<br>
<fieldset><legend>Title</legend>//用yui.ext做翻转按钮, super easy(美工最爱!?^^)<br>showBtn = getEl('showIntro');<br>showBtn.on('click', this.showDialog, this, true);<br>showBtn.applyStyles("cursor:pointer");<br>showBtn.on('mouseover', function(){showBtn.dom.src='images/over_10.gif'}, this, true);<br>showBtn.on('mouseout', function(){showBtn.dom.src='images/btn_10.gif'}, this, true);</fieldset>
<p>&#160;</p>
<p><br>
<fieldset><legend>Title</legend>//左边动画效果,createDelegate()负责轮换效果<br>var luo=getEl("left_pic");<br>luo.move('right', 250, true, .1, function(){<br>&nbsp;&nbsp; luo.dom.src='images/'+who+".gif";<br>&nbsp;&nbsp; luo.move('left', 250, true, .15, null, YAHOO.util.Easing.easeOutStrong);<br>}.createDelegate(this));</fieldset>
<p>&#160;</p>
<p>2.在LayoutDialog中加入Tabs</p>
<p>LayoutDialong分两个区域：west &amp; center。而center之中我们要加入tabs，并逐一附加active的事件</p>
<p>&nbsp;&nbsp;&nbsp;<br>
<fieldset><legend>Title</legend>
<p>var center = layout.getRegion('center'); <br>var tab1 = new YAHOO.ext.ContentPanel('luo', {title: '罗老师作品'}); <br>center.add(tab1); <br>center.add(new YAHOO.ext.ContentPanel('chen', {title: '陈老师作品'})); </p>
<p>//center.on('panelactivated',function(){<br>//&nbsp; alert(center.titleTextEl);<br>//}, this, true);<br>//center.showPanel('center');&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>/*two ways to activate the tabs.and tabs= many CPs<br>如果在BasicDialog中，只需要dialog本身就可以获取getTabs,因为Dialog本身就是<br>唯一的一个Region;<br>但在LayoutDialog中，Region是多个的，所有要指明哪个一个Region才行<br>*/</p>
<p>&nbsp;// stoe a refeence to the tabs 获取TABS集合<br>var tabs = layout.getRegion('center').getTabs();//逐一加入事件<br>tabs.getTab('center').on('activate', function(){this.show_thumb('student')}, this, true);<br>tabs.getTab('luo').on('activate', function(){this.show_thumb('luo')}, this, true);<br>tabs.getTab('chen').on('activate',function(){this.show_thumb('chen')}, this, true);&nbsp;<br>//center.showPanel('chen'); //用Region激活也可以<br>/*Tips:不能立即激活事件，会点延时，经过多行代码的延时便ok ！用addbufferlistener理论上也可以*/<br>layout.getRegion('center').getTabs().activate('center'); 3.View的使用方式 </p>
<p>//XML:index方式访问字段；JSON：直接使用字段名<br>var tpl = new YAHOO.ext.Template( <br>&nbsp;'&lt;div class="thumb"&gt;'+<br>&nbsp;'&lt;div&gt;&lt;img onclick=popupDialog("userfiles/image/'+who+'/{0}",{2},{3}) '+<br>&nbsp;' src=userfiles/image/lite_'+who+'/{0}&gt;&lt;/div&gt;' + <br>&nbsp;'&lt;div&gt;文件大小: {1}&lt;/div&gt;'+<br>&nbsp;'&lt;/div&gt;'<br>); <br>tpl.compile(); //&#8220;编译DOM&#8221;加速</p>
<p>var schema = {<br>&nbsp;tagName: 'row',//Item项<br>&nbsp;id: 'id',//ID如不需要时，设置空白字符串，不能取消！<br>&nbsp;Fields: ['filename','filesize','width','height']//读取的字段<br>};<br>var dm = new YAHOO.ext.grid.XMLDataModel(schema);<br>var mainView = new YAHOO.ext.View('pic_'+who, <br>tpl,<br>dm, {<br>&nbsp;singleSelect: true,//If JSON,还需指定一个config:jsonRoot<br>&nbsp;emptyText : '&lt;div style="padding:10px;"&gt;没有匹配的内容！&lt;/div&gt;'<br>}); <br>dm.on('load',function(){}, this, true); <br>mainView.on('click', function(vw, index, node, e){<br>&nbsp;//alert('Node "' + node[] + '" at index: ' + index + ' was clicked.')<br>},this, true);<br>mainView.prepareData = function(data){<br>&nbsp;// prepare,用于自定义格式<br>&nbsp;//如JSON方式直接属性名访问，e.g data.sizeString = formatSize(data.size);<br>&nbsp;data[1] = formatSize(data[1]);<br>&nbsp;return data;<br>};<br>//用DataModel加载文件，如果是JSONView，这个服务由JSONView本身（UpdateManager）提供<br>dm.load('xml.asp?who='+who);&nbsp;</p>
</fieldset><br>4.JSONView的使用方式
<p>&#160;</p>
<p>
<fieldset><legend>Title</legend>
<p>var dh = YAHOO.ext.DomHelper; <br>dh.append(document.body, {tag: 'div', id: 'editUserDialog-user'}); <br>//XML:index方式访问字段；JSON：直接使用字段名<br>var tpl = new YAHOO.ext.Template('Username: {username}' + <br>'Birthday: {birthday}' + <br>'Member Since: {join_date}' + <br>'Last Login: {last_login}'); <br>tpl.compile(); <br>var mainView = new YAHOO.ext.JsonView('pic', <br>tpl, {<br>&nbsp;&nbsp; singleSelect: true,<br>&nbsp;&nbsp; jsonRoot: 'user',<br>&nbsp;&nbsp; emptyText : 'No images match the specified filter'<br>}); <br>mainView.load("test.asp", "id=2"); <br>//JSONView特有的异常事件<br>mainView.on('loadexception', function(){onLoadException()}, this, true);</p>
<p>var onLoadException= function(v,o){<br>&nbsp;&nbsp; alert('Error'); <br>};</p>
</fieldset><br>5.获取XML/JSON的fields值与分页
<p>&#160;</p>
<p>这两个问题放在一起讨论的原因是至今我还不能实现。如果按照jack的办法：</p>
<p>
<fieldset><legend>Title</legend>mainView.on('click', function(vw, index, node, e){<br>&nbsp;alert('Node "' + node.id + '" at index: ' + index + ' was clicked.');<br>});</fieldset><br>可得到index但node.id无法获取。我只好用较丑陋的方式实现： <br>
<fieldset><legend>Title</legend>//在Domhelper中&#8220;硬&#8221;输出click事件<br>var tpl = new YAHOO.ext.Template( &nbsp;'&lt;div class="thumb"&gt;'+&nbsp;'&lt;div&gt;&lt;img onclick=popupDialog("userfiles/image/'+who+'/{0}",{2},{3}) '+&nbsp;' src=userfiles/image/lite_'+who+'/{0}&gt;&lt;/div&gt;' + &nbsp;'&lt;div&gt;文件大小: {1}&lt;/div&gt;'+&nbsp;'&lt;/div&gt;'); </fieldset><br>分页：<br>View的分页视乎应该通过DataModel。但我没成功过。如知道缘由的朋友恳请告之。<br>
<p>&#160;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134959.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:27 <a href="http://www.blogjava.net/boluobn/articles/134959.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第八天:EXT的布局（Layout）</title><link>http://www.blogjava.net/boluobn/articles/134953.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:16:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134953.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134953.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134953.html</trackback:ping><description><![CDATA[<p>Summary: 本文是区域管理器（region manager）的教程的第一篇，为您介绍如何创建区域，如何增加版面到这些区域。 </p>
<p><br>Author:Dave Fenwick<br>Published: May 01, 2007<br>Translater: Frank Cheung </p>
<p>Ext的layout布局对于建立WEB程序尤为有用。关于布局引擎（layout engine），区域管理器（region manager）的教程将分为几部分，本文是第一篇，为您介绍如何创建区域，如何增加版面到这些区域。</p>
<p>布局引擎(layout engine)这一功能早已在EXT前个ALPHA实现了。 Jack Slocum对于怎样环绕某一区域，给与指定区域管理的策略，和建立界面的问题，在他的第一、第二篇关于跨浏览器的WEB2.0布局功能的博客中，进行过讨论。定义一个DOM元素的边界（edge），使之一个布局的边框（border）－－这种做法使得创建&#8220;加厚型(thick－like)&#8221;客户端UI的开发更进一大步。</p>
<p>布局管理器(layout manager)负责管理这些区域。布局管理的主要的用户组件是BorderLayout类。该类为EXT开发富界面的程序提供了一个切入点。Layout的含意是划分好一些预定的区域。可用的区域分别有south, east, west, north,和center。每一个BorderLayout对象都提供这些区域但只有center要求必须使用的。如果你在单独一个区域中包含多个面板，你可通过NestedLayoutPanel 类套嵌到BorderLayout 实例中。</p>
<p>注意事项：本教程的每个文件都是.html和.js格式的。教程每一步都有演示,你也可以下载这些文件在编辑器（zip格式提供在这里）中看看发生什么事。</p>
<p>面板（Pane）是区域管理（region management）的另外一个组件。面板提供了这么一个地方，可为您的EXT器件（widget）、加载的HTML,嵌入的IFrames、或者是你日常在HTML页面上摆放的随便一样东西。NestedLayoutPanel也是一个面板，只不过用于链接多个BorderLayout的区域，其它的面板包括内容面板 ContentPanel,GRID面板 GridPanel,和树状面板 TreePanel。</p>
<p>简单的例子<br>下面的layout包含 north, south, east, west,和center的区域，而且每个区域包含一个ContentPanel，各区域之间使用得了分隔条分割开。</p>
<p>&nbsp;</p>
<p>
<fieldset><legend>Title</legend>var mainLayout = new Ext.BorderLayout(document.body, <br>{<br>&nbsp;&nbsp;&nbsp; north: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp; south: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp; east: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp; west: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp; center: {<br>&nbsp;&nbsp;&nbsp; }<br>});</fieldset><br>这是一个非常基本的layout,只是分配了东南西北中间的区域、分隔条、设置一下初始尺寸，并最迟定义中间区域。本例中，BorderLayout被绑定到"document.body"这个DOM元素，其实BorderLayout还可以绑定到任何一个封闭的DOM元素。定义好BorderLayout之后，我们加入ContentPanel对象（基于本例）。
<p>&#160;</p>
<p>
<fieldset><legend>Title</legend>mainLayout.beginUpdate();<br>mainLayout.add('north', new Ext.ContentPanel('north-div', {<br>&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>}));<br>mainLayout.add('south', new Ext.ContentPanel('south-div', {<br>&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>}));<br>mainLayout.add('east', new Ext.ContentPanel('east-div', {<br>&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>}));<br>mainLayout.add('west', new Ext.ContentPanel('west-div', {<br>&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>}));<br>mainLayout.add('center', new Ext.ContentPanel('center-div', {<br>&nbsp;&nbsp;&nbsp; fitToFrame: true<br>}));<br>mainLayout.endUpdate();</fieldset><br>当前的例子是将ContentPanel加入到所有区域中。由调用mainLayout.beginUpdate()开始。beginUpdate()告诉BorderLayout对象在执行endUpate()方法之前，先不要对加入的对象排版布局。这样的好处是避免了ContentPanel有对象加入时，导致UI的刷新，改进了整体的用户体验。执行beginUpdate()之后，加入五个ContentPanel对象到区域。所有的ContentPanel对象（除中间的那个外），都设置是可关闭的（closbale）。所有的ContentPanel对象也都设置为自动适配它们的父元素。最后执行endUpdate()渲染layout。
<p>&#160;</p>
<p>&nbsp;</p>
<p>InternetExploer注意事项：BorderLayout所容纳的元素必须有一个SIZE以便正确渲染。典型地你无须为document.body 指明size，因为document.body通常是有size的了（大多数情况，－如果你在浏览器上什么也看不到）。但是如果你将layout连同容器放到现有的web页面上（&#8216;可能是DIV）,那么DIV的size应该先指明以便正确渲染。如下列显示正常：</p>
<p>好，让我们趁热打铁，看看完整的layout是怎样的。假设ext是一子目录叫做ext-1.0，父目录下面的代码。</p>
<p>simple.html:</p>
<p>
<fieldset><legend>Title</legend>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="north-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="south-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="east-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="west-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="center-div"&gt;&lt;/div&gt;<br>&lt;/body&gt;</fieldset>
<p>&#160;</p>
<p><br>simple.js:</p>
<p>
<fieldset><legend>Title</legend>Simple = function() {<br>&nbsp;&nbsp;&nbsp; return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init : function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mainLayout = new Ext.BorderLayout(document.body, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; north: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; south: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; east: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; west: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; },<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center: {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.beginUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('north', new Ext.ContentPanel('north-div', {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('south', new Ext.ContentPanel('south-div', {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('east', new Ext.ContentPanel('east-div', {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('west', new Ext.ContentPanel('west-div', {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('center', new Ext.ContentPanel('center-div', {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.endUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; };<br>}();<br>Ext.EventManager.onDocumentReady(Simple.init, Simple, true);</fieldset><br>加入内容<br>上面的例子做的layout,除了可移动分割栏外，功能还不强大。需要加入些内容。有几种的办法加入内容。如果您直接加入内容到DIV中（ContentPanel绑定的那个），ContentPanel对象会对div里面的内容进行渲染。尽管试试！我们会更改html内容加入 center-div中。
<p>&#160;</p>
<p>simple2.html<br>
<fieldset><legend>Title</legend>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="north-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="south-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="east-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="west-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="center-div"&gt;This is some content that will display in a panel when a ContentPanel object is attached to the div.&lt;/div&gt;<br>&lt;/body&gt;</fieldset><br>&nbsp;
<p>&#160;</p>
<p>除此之外，还可以利用ContentPanel对象带有的function加载数据。可用的方法有几种，这里我们使用其中两种：setContent() 与 setUrl()。setContent()允许您直接从JavaScipt程序中插入HTML。setUrl()，允许您从服务端得到数据加入ContentPanel中。</p>
<p>我们原来的例子中，ContentPanel对象创建的时候是匿名的（anonymous）。这没问题，但要引用它们，你需要遍历区域管理器所分配的对象以获得引用的对象。这不是最好的办法，所有我的做法是分配一个变量给ContentPanel然后便可直接引用。</p>
<p>simple3.js</p>
<p>
<fieldset><legend>Title</legend>Simple = function() {<br>&nbsp;&nbsp;&nbsp; var northPanel, southPanel, eastPanel, westPanel, centerPanel;<br>&nbsp;&nbsp;&nbsp; return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init : function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mainLayout = new Ext.BorderLayout(document.body, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; north: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; south: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; east: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; west: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.beginUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('north', northPanel = new Ext.ContentPanel('north-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('south', southPanel = new Ext.ContentPanel('south-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('east', eastPanel = new Ext.ContentPanel('east-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('west', westPanel = new Ext.ContentPanel('west-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('center', centerPanel = new Ext.ContentPanel('center-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.endUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; northPanel.setContent('This panel will be used for a header');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; westPanel.setContent('');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; centerPanel.setUrl('index.html');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; centerPanel.refresh();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; };<br>}();<br>Ext.EventManager.onDocumentReady(Simple.init, Simple, true);</fieldset><br>我们现在从现有的页面动态加载内容。但是这里有个问题。若果内容页面积过大而撑破页面的话将没有意义了。我们提供了一些配置属性以解决这类问题。当fitToFrame为true时，就自动配置autoScroll。内容一旦溢出就会出现滚动条。另外一个涉及InternetExploer的问题,是中间的内容的样式没有生效，原因是一些浏览器支持动态样式而一些不直接，要较好地解决上述问题，推荐使用Iframe标签。
<p>&#160;</p>
<p>用IFRAME标签做布局可灵活地处理，我们准备在DOM中直接操纵IFRAME.这里IFRAME成为面板的容器，以填入中间区域的内容</p>
<p>设置一下 IFRAME的滚动条并放到中间的页面。.</p>
<p>simple4.html<br>
<fieldset><legend>Title</legend>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="north-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="south-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="east-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="west-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="center-div"&gt;&lt;iframe id="center-iframe" frameborder="0" style="border:0px none;overflow:none"&gt;&lt;/iframe&gt;&lt;/div&gt;<br>&lt;/body&gt;</fieldset>
<p>&#160;</p>
<p>simple4.js</p>
<p>
<fieldset><legend>Title</legend>Simple = function() {<br>&nbsp;&nbsp;&nbsp; var northPanel, southPanel, eastPanel, westPanel, centerPanel;<br>&nbsp;&nbsp;&nbsp; return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init : function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mainLayout = new Ext.BorderLayout(document.body, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; north: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; south: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; east: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; west: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.beginUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('north', northPanel = new Ext.ContentPanel('north-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('south', southPanel = new Ext.ContentPanel('south-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('east', eastPanel = new Ext.ContentPanel('east-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('west', westPanel = new Ext.ContentPanel('west-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('center', centerPanel = new Ext.ContentPanel('center-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, autoScroll: true, resizeEl: 'center-iframe'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.endUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; northPanel.setContent('This panel will be used for a header');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.get('center-iframe').dom.src = 'index.html';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; };<br>}();<br>Ext.EventManager.onDocumentReady(Simple.init, Simple, true);</fieldset><br>&nbsp;
<p>&#160;</p>
<p>当前的进展不错。大多数情况滚动条工作起来是很好的，但留意一样的东西， Internet Explorer 7之前的版本，如果文档完整指明DTD的DOCTYPE标签，IE很可能出现垂直滚动条的同时也显示水平滚动条。这个IE布局的一个BUG。</p>
<p>现在这是个基本的LAYOUT和几个ContentPanel对象。接着我们加入一条工具栏（toolbar）到中间的ContentPanel对象。创建过程非常简单。由于主题的关系，我并不准备在这里详细介绍如何创建toolbat。这是简单的创建toolbar的过程：</p>
<p>var simpleToolbar = new Ext.Toolbar('simple-tb');<br>simpleToolbar.addButton({ text: 'Scroll Bottom', cls: 'x-btn-text-icon scroll-bottom'});<br>simpleToolbar.addButton({ text: 'Scroll Top', cls: 'x-btn-text-icon scroll-bottom'});要加入toolbar,需要先加入HTML的容器，我们需要加入一些代码以创建toolbar，然后绑定到中间的区域。toolbar有两个按钮： Scroll Bottom和Scroll Top。这些按钮会滚动IFRAME内容到底部或是顶部。为了尽可能兼容多浏览器，我们的加入一个function来控制IFRAME文档。</p>
<p>simple5.html<br>
<fieldset><legend>Title</legend>&lt;html&gt;<br>&lt;body&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="north-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="south-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="east-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="west-div"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp; &lt;div id="center-div"&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;div id="center-tb"&gt;&lt;/div&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;iframe id="center-iframe" frameborder="0" scrolling="auto" style="border:0px none;"&gt;&lt;/iframe&gt;<br>&nbsp;&nbsp;&nbsp; &lt;/div&gt;<br>&lt;/body&gt;<br>&lt;/html&gt;</fieldset>
<p>&#160;</p>
<p>simple5.js</p>
<p>
<fieldset><legend>Title</legend>
<p>function getIframeDocument(el) {<br>&nbsp;&nbsp;&nbsp; var oIframe = Ext.get('center-iframe').dom;<br>&nbsp;&nbsp;&nbsp; var oDoc = oIframe.contentWindow || oIframe.contentDocument;<br>&nbsp;&nbsp;&nbsp; if(oDoc.document) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oDoc = oDoc.document;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return oDoc;<br>}</p>
<p>Simple = function() {<br>&nbsp;&nbsp;&nbsp; var northPanel, southPanel, eastPanel, westPanel, centerPanel;<br>&nbsp;&nbsp;&nbsp; return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init : function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var simpleToolbar = new Ext.Toolbar('center-tb');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleToolbar.addButton({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: 'Scroll Bottom', cls: 'x-btn-text-icon scroll-bottom', handler: function(o, e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iframeDoc = getIframeDocument('center-iframe');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframeDoc.body.scrollTop = iframeDoc.body.scrollHeight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleToolbar.addButton({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: 'Scroll Top', cls: 'x-btn-text-icon scroll-top', handler: function(o, e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iframeDoc = getIframeDocument('center-iframe');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframeDoc.body.scrollTop = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mainLayout = new Ext.BorderLayout(document.body, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; north: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; south: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; east: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; west: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center: { }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.beginUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('north', northPanel = new Ext.ContentPanel('north-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('south', southPanel = new Ext.ContentPanel('south-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('east', eastPanel = new Ext.ContentPanel('east-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('west', westPanel = new Ext.ContentPanel('west-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('center', centerPanel = new Ext.ContentPanel('center-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, autoScroll: true, resizeEl: 'center-iframe', toolbar: simpleToolbar<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.endUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; northPanel.setContent('This panel will be used for a header');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.get('center-iframe').dom.src = 'index.html';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; };<br>}();<br>Ext.EventManager.onDocumentReady(Simple.init, Simple, true);</p>
</fieldset><br>一个标准的layout已经差不多了。区域可设置标题，这样可以把几个区域区分开来，创建该区域面板的时候指定属性即可。
<p>&#160;</p>
<p>所有的区域都可以收缩和展开。要使一个区域可收缩，你应在区域配置项中指定collapsible属性。属性collapsedTitle是用于区域收缩之后显示的文字，collapsedTitle属性只用于north和south区域。</p>
<fieldset><legend>simple6.js</legend>
<p>function getIframeDocument(el) {<br>&nbsp;&nbsp;&nbsp; var oIframe = Ext.get('center-iframe').dom;<br>&nbsp;&nbsp;&nbsp; var oDoc = oIframe.contentWindow || oIframe.contentDocument;<br>&nbsp;&nbsp;&nbsp; if(oDoc.document) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oDoc = oDoc.document;<br>&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; return oDoc;<br>}</p>
<p>Simple = function() {<br>&nbsp;&nbsp;&nbsp; var northPanel, southPanel, eastPanel, westPanel, centerPanel;<br>&nbsp;&nbsp;&nbsp; return {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; init : function() {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var simpleToolbar = new Ext.Toolbar('center-tb');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleToolbar.addButton({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: 'Scroll Bottom', cls: 'x-btn-text-icon scroll-bottom', handler: function(o, e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iframeDoc = getIframeDocument('center-iframe');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframeDoc.body.scrollTop = iframeDoc.body.scrollHeight;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; simpleToolbar.addButton({<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; text: 'Scroll Top', cls: 'x-btn-text-icon scroll-top', handler: function(o, e) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var iframeDoc = getIframeDocument('center-iframe');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; iframeDoc.body.scrollTop = 0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var mainLayout = new Ext.BorderLayout(document.body, {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; north: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 50 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; south: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 125, titlebar: true, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; collapsedTitle: 'Status', collapsible: true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; east: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100 <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; west: { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; split: true, initialSize: 100, titlebar: true, collapsible: true<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }, <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; center: { titlebar: true}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; });<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.beginUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('north', northPanel = new Ext.ContentPanel('north-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('south', southPanel = new Ext.ContentPanel('south-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false, title: 'Status'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('east', eastPanel = new Ext.ContentPanel('east-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('west', westPanel = new Ext.ContentPanel('west-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, closable: false, title: 'Navigation'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }));<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.add('center', centerPanel = new Ext.ContentPanel('center-div', { <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fitToFrame: true, autoScroll: true, resizeEl: 'center-iframe', <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; toolbar: simpleToolbar, title: 'Content'<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; })); <br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mainLayout.endUpdate();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; northPanel.setContent('This panel will be used for a header');<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Ext.get('center-iframe').dom.src = 'index.html';<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp; };<br>}();<br>Ext.EventManager.onDocumentReady(Simple.init, Simple, true);</p>
</fieldset>
<p>&nbsp;</p>
<p>注意我们收藏起west区域时，是没有title的。当前的HTML没有提供对一个元素的90度的旋转。我们只好用一张透明的图片来实现，上面的文字是'Navigation',宽18p,高150p,然后90度旋转。</p>
<p>为了显示图片，我们需要增大EXT原先的widget样式，只须在HTML头样式表中加入下列样式便可得到适合的样式效果。如simple7.html示。</p>
<p>
<fieldset>.x-layout-collapsed-west {<br>&nbsp;&nbsp;&nbsp; background-image: url(navigation.gif);<br>&nbsp;&nbsp;&nbsp; background-repeat: no-repeat;<br>&nbsp;&nbsp;&nbsp; background-position: center;<br>}</fieldset><br>教程的第二部分我们将会接触layout manager的一些高级细节内容，包括内嵌layouts，可编程的展开、收缩区域，创建tab layout和其它一些创建EXTellent程序的有效方法。<br>
<p>&#160;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:16 <a href="http://www.blogjava.net/boluobn/articles/134953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第九日：表单入门</title><link>http://www.blogjava.net/boluobn/articles/134949.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:05:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134949.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134949.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134949.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134949.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134949.html</trackback:ping><description><![CDATA[<p>摘要： 本教程教你如何入手去创建一个基本的表单。 <br>Author: Shea Frederick<br>Translater:Hegz<br>Published: May 05, 2007<br>Translated:May 14,2007<br>出处：<a href="http://www.fleaphp.org.cn/bbs/viewthread.php?tid=906&amp;page=1&amp;extra=page%3D1#pid4736">http://www.fleaphp.org.cn/bbs/viewthread.php?tid=906&amp;page=1&amp;extra=page%3D1#pid4736</a></p>
<p>我建议下载用于这个例子的一段程序，这样可能对你有一些帮助。你也可以找一个有效的例子。</p>
<p>表单体<br>首先要做的第一件事就是创建一个表单体，这相当于在HTML中书写一个 <br>标识。 </p>
<p><br>var form_employee = new Ext.form.Form({<br>&nbsp;labelAlign: 'right',<br>&nbsp;labelWidth: 175,<br>&nbsp;buttonAlign: 'right'<br>});<br>&nbsp;创建表单字段<br>表单示例由name、title、hire_date和active四个表单字段构成。开头的两个表单字段name和title，只是简单的文本字段，我们会用TextField方法来创建它们。</p>
<p>重要的配置选项是name，定义该选项与HTML中定义一个表单字段名几乎一样。</p>
<p><br>var employee_name = new Ext.form.TextField({<br>&nbsp;fieldLabel: 'Name',<br>&nbsp;name: 'name',<br>&nbsp;width:190<br>});</p>
<p>var employee_title = new Ext.form.TextField({<br>&nbsp;fieldLabel: 'Title',<br>&nbsp;name: 'title',<br>&nbsp;width:190<br>});<br>&nbsp;跟着的hire_date字段是一个日期字段，我们会用DateField方法来创建，它会为我们弹出一个别致的日期选择器来让我们选择日期。</p>
<p>format配置选项被用来为PHP指定日期格式标准（PHP的日期格式）。日期格式字符串的调整须与你所用的日期格式相匹配。</p>
<p>&nbsp;</p>
<p>var employee_hire_date = new Ext.form.DateField({<br>&nbsp;fieldLabel: 'Hire Date',<br>&nbsp;name: 'hire_date',<br>&nbsp;width:90,<br>&nbsp;allowBlank:false,<br>&nbsp;format:'m-d-Y'<br>});<br>&nbsp;最后一个表单元素active是一个布尔值，我们使用Checkbox方法来创建。</p>
<p><br>var employee_active = new Ext.form.Checkbox({<br>&nbsp;fieldLabel: 'Active',<br>&nbsp;name: 'active'<br>});<br>&nbsp;完成表单<br>现在，我们把表单里的所有表单字段加入到fieldset中去。当然了，如果你想在fieldset的外面进行，可以选择使用add方法。 </p>
<p><br>form_employee.fieldset(<br>&nbsp;{legend:'Employee Edit'},<br>&nbsp;employee_name,<br>&nbsp;employee_title,<br>&nbsp;employee_hire_date,<br>&nbsp;employee_active<br>)<br>&nbsp;最后，最不能少的就是submit按钮，它与一小段的错误检测代码块一起被addButton方法加进来。当该按钮被点击，就会调用render方法，传入div标识的&#8220;id&#8221;，然后在网页的div里把表单显示出来。</p>
<p><br>form_employee.addButton('Save', function(){<br>&nbsp;if (form_employee.isValid()) {<br>&nbsp;&nbsp;Ext.MessageBox.alert('Success', 'You have filled out the form correctly.');&nbsp;<br>&nbsp;}else{<br>&nbsp;&nbsp;Ext.MessageBox.alert('Errors', 'Please fix the errors noted.');<br>&nbsp;}<br>}, form_employee);</p>
<p>form_employee.render('employee-form');<br>&nbsp;下一步</p>
<p>虽然本教程让你懂得了如何去创建一个表单，但创建出来的表单什么事情也干不了。就像一部没有引擎的小汽车——它看起来可能很漂亮，但不能让你走得更远。<br></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134949.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:05 <a href="http://www.blogjava.net/boluobn/articles/134949.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第九日（B):为一个表单填充或提交数据</title><link>http://www.blogjava.net/boluobn/articles/134948.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:04:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134948.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134948.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134948.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134948.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134948.html</trackback:ping><description><![CDATA[<p>摘要：这个教程将指导你如何获取数据到你的表单并将这些数据提交。 <br>Author: Shea Frederick<br>Translater: pplboy <br>Published: May 22, 2007<br>Translater Date:May 30.2007</p>
<p>这个教程使用了在getting started tutorial教程中使用过的 雇员信息编辑表单。如果你仍然不熟悉如何创建一个表单，你可以首先看一下这个例子。我建议下载用于这个例子的一段程序，这样可能对你有一些帮助。你也可以找一个有效的例子。</p>
<p>我们将经历使用表单的整个过程，从最初的从服务器获取数据填入表单，到将数据返回给服务器。在后端我使用PHP和MySQL, 然而这个例子对于PHP和MySQL来说并不是特殊的，而是只要求你能够从你的服务器读取和输出JSON数据。</p>
<p>让我们开始吧 <br>首先我们必须设置表单的url, 这是一个能获得POST数据并将其写进我们的数据库的PHP脚本.</p>
<p><br>var form_employee = new Ext.form.Form({<br>&nbsp;...<br>&nbsp;<a href="http://www.blogjava.net/boluobn/admin/'forms-submit-process.php'">url:'forms-submit-process.php'</a>,<br>&nbsp;...<br>});<br>&nbsp;我们的数据包含5个字段：id, name, title, hire_date和active,这些字段可以被取回并放置到一个数据存储对象（Store）中。</p>
<p>以下的程序构造了一个数据存储对象，在这个时候没有数据被取回，我们的数据代理（Proxy）对象提交到一个PHP脚本，用来取回数据库id为14的行 并将它转换成一个JSON字符串。</p>
<p><br>employee_data = new Ext.data.Store({<br>proxy: new Ext.data.HttpProxy({url: 'forms-submit-getdata.php?id=14'}),<br>reader: new Ext.data.JsonReader({},[ 'id', 'name', 'title', 'hire_date', 'active']),<br>remoteSort: false<br>});</p>
<p><br>接下来要做的是设定我们的事件监听者来监察什么时候数据被载入， 这个将保证我们不会在数据被载入之前填入表单。</p>
<p><br>employee_data.on('load', function() {<br>&nbsp;<br>&nbsp;// data loaded, do something with it here... <br>&nbsp;&nbsp;&nbsp;<br>});<br>&nbsp;当数据被载入后，我们可以取回数据并用setValue方法将其填入表单。这里我们用getAt(0) 从我们的数据存储对象里重新取回第一行数据（行zero）。</p>
<p><br>注意：这里使用的表单和表单字段在getting started tutorial中有定义和解释。</p>
<p><br>employee_name.setValue(employee_data.getAt(0).data.name);<br>employee_title.setValue(employee_data.getAt(0).data.title);<br>employee_hire_date.setValue(employee_data.getAt(0).data.hire_date);<br>employee_active.setValue(Ext.util.Format.boolean(employee_data.getAt(0).data.active));<br>&nbsp;我们将要创建提交按钮并添加到表单，记得给来源于表单字段的POST数据设定扩展参数。你将会发现通过行确定字段（id）对于让php脚本找到需要更新的行非常有用，同时为了更好的判断，还需要一个action判定。</p>
<p><br>我还使用isValid参数来保证表单在提交前符合每一个字段的要求。</p>
<p><br>form_employee.addButton('Save', function(){<br>&nbsp;if (form_employee.isValid()) {<br>&nbsp;&nbsp;form_employee.submit({<br>&nbsp;&nbsp;&nbsp;params:{<br>&nbsp;&nbsp;&nbsp;&nbsp;action:'submit',<br>&nbsp;&nbsp;&nbsp;&nbsp;id:employee_data.getAt(0).data.id<br>&nbsp;&nbsp;&nbsp;}, <br>&nbsp;&nbsp;&nbsp;waitMsg:'Saving...'<br>&nbsp;&nbsp;});&nbsp;<br>&nbsp;}else{<br>&nbsp;&nbsp;Ext.MessageBox.alert('Errors', 'Please fix the errors noted.');<br>&nbsp;}<br>}, form_employee);</p>
<p>form_employee.render('employee-form');<br>&nbsp;读取我们的数据<br>现在我们来读取数据</p>
<p><br>employee_data.load();<br>&nbsp;这样真的能够惊人简单的创建一个可用的表单，与成对的服务器段脚本接合，就能够将数据从数据库获取并写入修改后的数据。这些服务端脚本可以简单到只需几行而已。</p>
<p>接下来是什么？</p>
<p>通常来说，API文件和例子对于学习怎么样将表单改造成你所需要的形式来说是很不错的途径。<br></p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134948.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:04 <a href="http://www.blogjava.net/boluobn/articles/134948.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第十日--模板（Templates）起步</title><link>http://www.blogjava.net/boluobn/articles/134946.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 06:01:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134946.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134946.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134946.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134946.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134946.html</trackback:ping><description><![CDATA[<p>第一步 您的HTML模板<br>第一个步骤没有任何特别，这里的HTML可以说是用来格式化你的数据。花括号里面的关键字就是你数据中的{id},{url} 和{text}的容器（placeholder） 。或者用纯数字{0},{1},{2}来表示,但是关键字的命名方式会使你的代码更可读。</p>
<p>现在我们加载html模板，创建一个模板对象（第五行），然后进行编译（第六行）。尽管编译模板不是必须的，但是一般情况下总能改善性能的。</p>
<p><br>&nbsp;var html = '&lt;a id="{id}" href="{url}" class="nav"&gt;{text}&lt;/a&gt;&lt;br /&gt;';<br>&nbsp;var tpl =<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br>&nbsp;&nbsp;&nbsp; new Ext.Template(html);<br>&nbsp;tpl.compile();<br>第二步，将数据加入到模板中<br>这里我们将使用append方法加入两行的数据。正如你所见，元素的&#8220;id&#8221;、&#8220;url&#8221;和&#8220;text&#8221;相对应于上述模板的容器。</p>
<p><br>&nbsp;tpl.append('blog-roll', {<br>&nbsp;&nbsp;&nbsp;&nbsp; id: 'link1', <br>&nbsp;&nbsp;&nbsp;&nbsp; url: 'http://www.jackslocum.com/', <br>&nbsp;&nbsp;&nbsp;&nbsp; text: "Jack's Site"<br>&nbsp;});<br>&nbsp;tpl.append('blog-roll', {<br>&nbsp;&nbsp;&nbsp;&nbsp; id: 'link2', <br>&nbsp;&nbsp;&nbsp;&nbsp; url: 'http://www.extjs.com/', <br>&nbsp;&nbsp;&nbsp;&nbsp; text: "Jack's New Site"<br>&nbsp;});</p>
<p>这就是模板的基本知识点，对于你来这说非常简单吧？</p>
<p>下一步<br>如果你想换换口味，文档区便是一个绝佳的好地方。看看范例Feed Viewer，里面就大量使用了模板。 </p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134946.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 14:01 <a href="http://www.blogjava.net/boluobn/articles/134946.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>学习EXT第十日（B）：学习利用模板（Templates）的格式化功能</title><link>http://www.blogjava.net/boluobn/articles/134942.html</link><dc:creator>菠萝</dc:creator><author>菠萝</author><pubDate>Tue, 07 Aug 2007 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/boluobn/articles/134942.html</guid><wfw:comment>http://www.blogjava.net/boluobn/comments/134942.html</wfw:comment><comments>http://www.blogjava.net/boluobn/articles/134942.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/boluobn/comments/commentRss/134942.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/boluobn/services/trackbacks/134942.html</trackback:ping><description><![CDATA[<p>Summary摘要：如何利用模板（Templates）的格式化功能和加入您自定义格式的函数<br>Author: Aaron Conran<br>Translater:Frank Cheung<br>Published: May 16, 2007</p>
<p>本教程基于Ext的模板引擎展开详述，亦是对 Shea Frederick&#8220;模板入门&#8221;教程一文的补充。假设读者已经初步接触过模板（Templates）,和格式化函数的基本语法为&#8220;{VARIABLE:[(可选的参数)]}&#8221;。 </p>
<p><br>正式开始<br>假设我们打算从一变量中， 打印出内容，但当中的内容有可能会占用过多的空间。对于这种情况，通过的办法是对该内容截取，限制在50个英文字符内，然后做成连接让用户点击后观察全文。函数"ellipsis" 的功能正是这样，可限制在任意字符数内。另外，在截取字符串的后面，该函数还会加上&#8220;...&#8220;，以示实际的内容还有更多。 </p>
<p>一个模板如下示：</p>
<p>&nbsp;</p>
<p>var myTpl = new Ext.Template('&lt;div&gt;{content:ellipsis(50)}&lt;br/&gt;&lt;a href="{moreLink}"&gt;Read More&lt;/a&gt;&lt;/div&gt;');<br>&nbsp;通过处理，其中有47个字符是属于内容本身的，另外三个字符是&#8221;...&#8220;,一共50个字符。</p>
<p>这是一份格式化函数的列表，可用于模板：<br>ellipsis(length) - 对大于指定长度部分的字符串，进行裁剪，增加省略号（&#8220;...&#8221;）的显示。适用于只显示前N位的字符，然后提供详细页面的场合。 <br>undef -检查一个值是否为underfined，如果是的转换为空值 <br>htmlEncode - 转换(&amp;, &lt;, &gt;, and ') 字符 <br>trim - 对一段文本的前后多余的空格裁剪 <br>substr(start, length) - 返回一个从指定位置开始的指定长度的子字符串。 <br>lowercase - 返回一个字符串，该字符串中的字母被转换为小写字母。 <br>uppercase - 返回一个字符串，该字符串中的字母被转换为大写字母。 <br>capitalize - 返回一个字符串，该字符串中的第一个字母转化为大写字母，剩余的为小写。 <br>usMoney - 格式化数字到美元货币。如：$10.97 <br>date[(format)] - 将一个日期解析成为一个特定格式模式的日期。如日期字符串不输入，默认为&#8220;月/日/年&#8221; <br>stripTags - 剥去变量的所有HTML标签 </p>
<p>您亦可以创建自定义的格式化函数，具体做法是，在模板的实例上加入新的方法，继而在模板上调用，格式化的函数应该像这样的："{VARIABLE:this.}"</p>
<p>这是一个简单是实例，对模板实例加入一个"yesNoFormat "的新函数。yesNoFormat 与ColdFusion转换&#8221;truthy&#8220;函数相类似 ，如果是真的输出"Yes",假的输出&#8221;No&#8220;。</p>
<p><br>var testCustomTpl = new Ext.Template('&lt;div&gt;User: {username} IsRevoked: {revoked:this.yesNoFormat}&lt;/div&gt;');<br>testCustomTpl.yesNoFormat = function(value) {<br>&nbsp;return value ? 'Yes' : 'No';<br>};&nbsp;&nbsp;<br>testCustomTpl.append(document.body, {username: 'aconran', revoked: 1});&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;下一步<br>关于怎么学好EXT这个框架我的看法是，在您熟悉的IDE中打开源码进行阅读。保证阁下一定会收获不少技巧和写代码的好习惯，而且极有可能发现新的大陆，还是没有归档的。熟悉模板Templates的简单用法和格式化功能后，就可进入下一步的学习：MasterTemplates。MasterTemplates提供了处理&#8221;子模板&#8220;的功能，以方便从数据库循环数据，同时亦包含模板（Templates）的所有功能。</p>
<p>&nbsp;</p>
<img src ="http://www.blogjava.net/boluobn/aggbug/134942.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/boluobn/" target="_blank">菠萝</a> 2007-08-07 13:53 <a href="http://www.blogjava.net/boluobn/articles/134942.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>