前往顾页
以后地位: 主页 > 收集编程 > .Net实例教程 >

Sys.UI.Data.DataNavigator与Sys.UI.Data.SortBehavior

时候:2014-02-26 14:49来源:知行网www.zhixing123.cn 编辑:麦田守望者

此次我想会商与阐发的内容是Sys.UI.Data.DataNavigator与Sys.UI.Data.SortBehavior。在这之前,可能感兴趣的朋友们需求先体味一下Atlas Client Script中Data Control的利用体例。可以先学习一些别的文章,比方官方申明《Start > Quickstart Developer Tasks > Performing Data Access》,而Dflying兄的Atlas介绍系列也实属佳构。

Sys.UI.Data.DataNavigator和Sys.UI.Data.SortBehavior的感化都是共同DataView进行数据操纵:一个操纵分页服从,一个操纵排序服从。究竟上这两个类都是属于帮助类,它们的服从是更加便利了开辟,而供应的分外服从却不多。

Sys.UI.Data.SortBehavior利用了DataView的自带的属性与体例为DataView的内容进行了排序。当一个SortBehavior被利用到了一个控件时,它会按照控件的点击来决定DataView的排序依次(在ASC和SESC之间切换),并且按照以后的排序依次为control利用不合的款式(sortAscendingCssClass或sortDescendingCssClass)。如果没有这个控件,我们可能就需求共同利用setProperty,invokeMethod进行较为复杂的利用了。换个角度说,如果某个服从比较复杂并且需求复用的话,我们可以像SortBehavior一样封装起一系列操纵。

Atlas中的控件设想其实不随便,而是实其实在地“有效”。

但是,与Sys.UI.Data.SortBehavior比拟,Sys.UI.Data.DataNavigator就有些古怪了。

Sys.UI.Data.DataNavigator供应了DataView的分页服从,不过不管是上一页也好,最后一页也罢,它的实现其实只是简朴的利用了DataView的一个函数:set_pageIndex。共同get_pageIndex获恰以后的页数,实现这些服从自没必要说。不过非常风趣(或继续利用下面的说法:古怪)的是触发DataNavigator那些服从的体例。DataNavigator没有供应任何的体例来触发它的那些操纵,它的那些操纵都是定义在DataNavigator的onBubbleEvent体例中。它的onBubbleEvent里判定了Sys.UI.Button工具传给它的Sys.UI.CommandEventArgs工具中commandName属性的值,然掉队行不合的操纵。

onBubbleEvent是我感觉在Atlas中比较独特的玩艺儿之一。它是定义在Sys.UI.Control类中的虚函数,直接或直接继承Sys.UI.Control的类可以对它进行重载。不过在代码中其实不会调用onBubbleEvent,如果需求bubble event,那么就需求调用定义在Sys.UI.Control类中的raiseBubbleEvent体例。熟谙ASP.NET Server Control开辟的朋友们应当可以发明这和ASP.NET中System.Web.UI.Control的OnBubbleEvent和RaiseBubbleEvent非常的近似,只可惜在Javascript中无法定义protected体例,只得把它们透露在外了。

可以看出Atlas有多么深厚的ASP.NET背景。与ASP.NET一样,Atlas中的raiseBubbleEvent体例也不是个虚函数,它的定义无法改变,我们来看一下它的代码:

this.raiseBubbleEvent = function(source, args) {
    
var currentTarget = this.get_parent();
    
while (currentTarget) {
        
if (currentTarget.onBubbleEvent(source, args)) {
            
return;
        }
        currentTarget 
= currentTarget.get_parent();
    }
}

从以后控件开端,调用onBubbleEvent体例,如果前往false,则继续向parent通报,如许event就被bubble了。这是很标准的raiseBubbleEvent服从实现。

但是事情没有这么简朴。在raiseBubbleEvent中可以看出,代码是经由过程parent属性获得上一级控件的援引。parent也是个无法重载的非虚成员,它定义在Sys.UI.Control中。不晓得为甚么,在官方的Client Library中贫乏这个属性。我们来看一下它的实现。

this.get_parent = function() {
    
if (_parent) {
        
return _parent;
    }
    
else {
        
var parentElement = this.element.parentNode;
        
while (parentElement) {
            
if (parentElement.control) {
                
return parentElement.control;
            }
            parentElement 
= parentElement.parentNode;
        }
        
return null;
    }
}

可以看出这个属性的逻辑,如果曾定义了parent,那么就前往parent援引,如果没有的话,那么就沿着DOM向父级元素找,找到第一个具有Atlas控件工具的元素。是以可以发明,parent其实不需求被强迫定义。为了证明这一点,在这里我借用一下Dflying兄在其文章《利用ASP.NET Atlas PageNavigator控件实现客户端分页导航》中编写的例子,我将对其进行简朴的点窜。

在Dflying兄的例子里有以下的定义:
 

<!-- PageNavigator -->
<div id="pageNavigator">
    
<input type="button" id="btnFirstPage" value="&lt;&lt;" />
    
<input type="button" id="btnPrevPage" value="&lt;" />
    
<span id="lblPageNumber"></span> / <span id="lblPageCount"></span>
    
<input type="button" id="btnNextPage" value="&gt;" />
    
<input type="button" id="btnLastPage" value="&gt;&gt;" />
</div>

<script type="text/xml-script">
    
<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
        
<components>
            ...
            
<dataNavigator id="pageNavigator" dataView="view" />
            
<button id="btnFirstPage" parent="pageNavigator" command="FirstPage" />
            
<button id="btnPrevPage" parent="pageNavigator" command="PreviousPage">
                ...
            
</button>
            
<button id="btnNextPage" parent="pageNavigator" command="NextPage">
                ...
            
</button>
            
<button id="btnLastPage" parent="pageNavigator" command="LastPage" />
            ...
        
</components>
    
</page>
</script>

在这里,dataNavigator是那些<input type="button" />的父结点,而在Atlas Xml Scripts中也为每个button指定了本身的parent属性。我们先测验测验着去除上方HTML定义的元素父子关系,保存下方Script不变:

<div id="pageNavigator"></div>
    
<input type="button" id="btnFirstPage" value="&lt;&lt;" />
    
<input type="button" id="btnPrevPage" value="&lt;" />
    
<span id="lblPageNumber"></span> / <span id="lblPageCount"></span>
    
<input type="button" id="btnNextPage" value="&gt;" />
    
<input type="button" id="btnLastPage" value="&gt;&gt;" />
</div>

运行,一切一般。可以发明作为dataNavigator的元素无需为那些button的父结点。

接着,我们保存HTML元素的父子关系,鄙人方撤消在Atlas Scripts中的parent定义,以下:

<script type="text/xml-script">
    
<page xmlns:script="http://schemas.microsoft.com/xml-script/2005">
        
<components>
            ...
            
<dataNavigator id="pageNavigator" dataView="view" />
            
<button id="btnFirstPage" parent="pageNavigator" command="FirstPage" />
            
<button id="btnPrevPage" parent="pageNavigator" command="PreviousPage">
                ...
            
</button>
            
<button id="btnNextPage" parent="pageNavigator" command="NextPage">
                ...
            
</button>
            
<button id="btnLastPage" parent="pageNavigator" command="LastPage" />
            ...
        
</components>
    
</page>
</script>

运行,还是一切一般。可见,Atlas会主动在DOM树中寻觅作为dataNavigator的control。感兴趣的朋友也能够测验测验着将上述二者都去除,如许分页服从就会见效了。

顶一下
(1)
100%
踩一下
(0)
0%
------分开线----------------------------
标签(Tag):C# C#实例教程 c#根本教程 C#源代码 c#技能
------分开线----------------------------
颁发评论
请自发遵循互联网相关的政策法规,严禁公布色情、暴力、革命的谈吐。
评价:
神色:
考证码:点击我更换图片
猜你感兴趣