解析数据集时访问datasource.page()

时间:2014-03-03 16:46:58

标签: jquery kendo-ui kendo-mobile

我正在尝试向我的数据源结果添加页面字段。我使用schema.parse来对齐字段名称,添加几个字段,以及一些基本的数据操作。我想添加的一个字段是数据源的当前页面。我可以使用datasource.page()方法但它只在数据源返回数据后更新,显然schema.parse在此之前发生。我正在寻找另一种方法来访问数据源的参数或以某种方式使用skip / total参数计算当前页面。

var ds = new kendo.data.DataSource({
    transport: {
        read: {
            url: PRODUCTAPI,
            data: getOfferData()
        }
    },
    serverPaging: true,
    pageSize: 50,
    schema: {
        data: "results",
        total: "count",
        model: { id: "id" },
        parse: function(response) {
            var myData = {};
            var results = [];
            prodcnt = response.results.length;
            for (var i = 0; i < response.results.length; i++) {
                var prod = response.results[i];
                var product = {
                    id: prod.id,
                    category: prod.category,
                    page: ??? // this is where I would like to know this.page()
                    // other fields here
                    prev_record: null,
                    next_record: null
                };
                results.push(product);
            }

           // do other stuff here

            return myData;
        }
    },
    change: function(e) {
        // I can access page() from here!
        var pg =this.page();
        console.log("page: " + pg); 
    }
});
编辑:我正在做的是这个。使用数据单击列表视图我正在调用详细视图。详细视图访问单击元素的UID,并使用getByUID从数据集中获取整个记录。从详细信息视图,用户可以使用“下一个/上一个”按钮来浏览详细记录,而无需返回列表视图。这工作正常,但如果用户到达数据源的边界,我需要知道他们开始的页面,以便手动调用datasource.page(x)。我试图通过数据源对象回来,没有运气。我认为另一种方法是在运行时将其包含在数据中。

2 个答案:

答案 0 :(得分:0)

您无法通过dataSource对象获取它。唯一可能的方法是通过以下方式记录该页面:

  1. 覆盖参数地图功能 - 我不建议
  2. 捕获寻呼机按钮上的点击,并从点击的按钮的HTML中获取数字并将其记录在变量中

答案 1 :(得分:0)

page号码添加到parse是非常脆弱的,因为您在显示时添加了一个有意义的属性,同时仍然没有如何显示数据。

让我们考虑使用以下内容添加页码:

var ds = new kendo.data.DataSource({
    data    : createRandomData(20),
    pageSize: 10,
    schema  : {
        model: {
            fields: {
                Id       : { type: 'number' },
                Page     : { type: 'number' },
                FirstName: { type: 'string' },
                LastName : { type: 'string' },
                City     : { type: 'string' }
            }
        },
        parse : function (d) {
            console.log("parse");
            $.each (d, function (idx, elem) {
                elem.Page = Math.floor(idx / ds.options.pageSize);
            });
            return d;
        }
    }
});

但是您在实际知道将要显示它的内容和方式之前添加页面。 请在此处进行检查:http://jsfiddle.net/OnaBai/2g5JU/2/并尝试按不同于Page的列进行排序...您会看到page实际上不是当前页面,而是初始页面。

如果您在客户端中过滤结果(在此处查看:http://jsfiddle.net/OnaBai/2g5JU/4/),我们只会显示CityLondon但结果被过滤掉之后的结果 parse因此,页码错误。

如果您确实需要在change事件中获取页码,那么您只需执行以下操作:

change    : function (e) {
    alert("current page:" + ds.page());
}

正如@PeturSubev建议的那样。

修改

使用问题版本中提供的附加内容,您需要的是在打开详细视图时返回列表所在的页面。这实际上并不意味着您已经移动了页面。如果您在单击下一步时未选择下一个项目,则原始页面将保留。

在此处查看:http://jsfiddle.net/OnaBai/tr63h/

我所拥有的是控制数据模型,其中我在详细信息窗口中显示当前显示项目的索引(idx)以及正在显示的数据(data)。

var model = kendo.observable({
    // Index of current displayed element in details window
    idx  : 0,
    // Data being displayed in the details window
    data : {
        FirstName: "",
        LastName: ""
    }
});

当我点击next时,我将该项目放在数据源的下一个位置:

$("#next").on("click", function(e) {
    if (model.idx < ds.data().length) {
        model.set("idx", model.idx + 1);
        model.set("data", ds.at(model.idx));
    }
});

当我点击prev时,我收到上一项:

$("#prev").on("click", function(e) {
    if (model.idx > 0) {
        model.set("idx", model.idx - 1);
        model.set("data", ds.at(model.idx));
    }
});

当我从列表中选择一个项目时,我会获得所选元素的索引及其内容,并将其设置在与详细信息绑定的模型结构中:

change : function (e) {
    var selected = list.select();
    var item = ds.getByUid(selected.data("uid"));
    var idx = ds.indexOf(item);
    model.set("data", item);
    model.set("idx", idx);
    model.set("page", ds.page());
    details.center().open();
}

如您所见,只要您不选择项目,就不需要返回原始页面。