G0574's Archiver

弯月圆刀 发表于 2008-7-8 15:25

yui 之 DataSource

细细体会,DataSource会带给你许多好处,一系列标准的接口和方法,使你可以用不变应万变。

还是用例子来说明吧:[code]{"ResultSet":{
    "totalResultsAvailable":665,
    "totalResultsReturned":10,
    "firstResultPosition":1,
    "ResultSetMapUrl":"http:\/\/local.yahoo.com\/mapview?stx=pizza&csz=Sunnyvale%2C+CA+94089&city=Sunnyvale&state=CA&radius=15&ed=9brhZa131DwigChqKlCo22kM1H_9WgoouCr87Ao-",
    "Result":[{
        "Title":"Pizza Depot",
        "Address":"919 E Duane Ave",
        "City":"Sunnyvale",
        "State":"CA",
        "Phone":"(408) 245-7760",
        "Latitude":"37.388537",
        "Longitude":"-122.003972",
        "Rating":{
            "AverageRating":"3.5",
            "TotalRatings":"5",
            "TotalReviews":"5",
            "LastReviewDate":"1161495667"},
        "Distance":"0.93",
        "Url":"http:\/\/local.yahoo.com\/details?id=21332021&stx=pizza&csz=Sunnyvale+CA&ed=6tiAL6160Sx1XVIEu1zIWPu6fD8rJDV4.offJLNUTb1Ri2Q.R5oLTYvDCz8YmzivI7Bz0gfrpw--",
        "ClickUrl":"http:\/\/local.yahoo.com\/details?id=21332021&stx=pizza&csz=Sunnyvale+CA&ed=6tiAL6160Sx1XVIEu1zIWPu6fD8rJDV4.offJLNUTb1Ri2Q.R5oLTYvDCz8YmzivI7Bz0gfrpw--",
        "MapUrl":"http:\/\/maps.yahoo.com\/maps_result?name=Pizza+Depot&desc=4082457760&csz=Sunnyvale+CA&qty=9&cs=9&ed=6tiAL6160Sx1XVIEu1zIWPu6fD8rJDV4.offJLNUTb1Ri2Q.R5oLTYvDCz8YmzivI7Bz0gfrpw--&gid1=21332021",
        "BusinessUrl":"http:\/\/pizza-depot.com\/",
        "BusinessClickUrl":"http:\/\/pizza-depot.com\/"},

        ...
    ]}
}
[/code]上面的代码是什么格式?json。下面是用来包裹这个数据的DataSource。[code]YAHOO.util.Event.addListener(window, "load", function() {
    YAHOO.example.XHR_JSON = new function() {
        this.formatUrl = function(elCell, oRecord, oColumn, sData) {
            elCell.innerHTML = "<a href='" + oRecord.getData("ClickUrl") + "' target='_blank'>" + sData + "</a>";
        };

        var myColumnDefs = [
            {key:"Title", label:"Name", sortable:true, formatter:this.formatUrl},
            {key:"Phone"},
            {key:"City"},
            {key:"Rating.AverageRating", label:"Rating", formatter:YAHOO.widget.DataTable.formatNumber, sortable:true}
        ];

        this.myDataSource = new YAHOO.util.DataSource("assets/php/ylocal_proxy.php?");
        this.myDataSource.responseType = YAHOO.util.DataSource.TYPE_JSON;
        this.myDataSource.connXhrMode = "queueRequests";
        this.myDataSource.responseSchema = {
            resultsList: "ResultSet.Result",
            fields: ["Title","Phone","City",{key:"Rating.AverageRating",parser:YAHOO.util.DataSource.parseNumber},"ClickUrl"]
        };

        this.myDataTable = new YAHOO.widget.DataTable("json", myColumnDefs,
                this.myDataSource, {initialRequest:"query=pizza&zip=94089&results=10&output=json"});

        var callback1 = {
            success : this.myDataTable.onDataReturnAppendRows,
            failure : this.myDataTable.onDataReturnAppendRows,
            scope : this.myDataTable
        };
        this.myDataSource.sendRequest("query=mexican&zip=94089&results=10&output=json",
                callback1);

        var callback2 = {
            success : this.myDataTable.onDataReturnInsertRows,
            failure : this.myDataTable.onDataReturnInsertRows,
            scope : this.myDataTable
        };
        this.myDataSource.sendRequest("query=chinese&zip=94089&results=10&output=json",
                callback2);
    };
});
[/code]

弯月圆刀 发表于 2008-7-28 23:10

datasource对于服务器来的数据可以进行自定义的parser,这个功能非常的实用。[code]fields: ["name", "breed", {key: "age", parser: YAHOO.util.DataSource.parseNumber}][/code]上面的代码中,对于服务器过来的age字段,进行parser,变成数字。

其实datasource的职能到这一步应该是到头了,接下来对于数据的使用时另一层面的问题了。比如:对于datatable来说,从datasource获取数据之后,这个数据就复制到recordset里面去了。在datatable上面的操作,可以通过datatable的界面来进行了。比如:获取用户所点击的row的数据时,是通过recordset。

弯月圆刀 发表于 2008-7-28 23:22

事件处理。

myDataTable.subscribe("rowSelectEvent", myHandler);

其中rowSelectEvent是事件。

onEventSelectRow是内置的处理rowSelectEvent事件的handler。

那么点击一条记录的时候,发生的事件是怎样的呢?

rowClickEvent  --handler--》onEventSelectRow(onEventSelectRow ( oArgs.event , oArgs.target ) )两个参数都是
oArgs.event <HTMLEvent> The event object.
oArgs.target <HTMLElement> The TR element.

也就是说默认情况下,通过设置myDataTable.subscribe("rowClickEvent", myDataTable.onEventSelectRow);  就可以达到我们常见的情景,对应的row变成深色。

如果同时订阅了rowSelectEvent事件,那么myhandler就会获得oArgs.el , oArgs.record,也就是相当于获得底层datasource的记录。

页: [1]

Powered by Discuz! Archiver 6.1.0  © 2001-2007 Comsenz Inc.