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



我正试图在数据源结果中添加一个页面字段。我使用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)。我尝试过通过数据源对象返回,但没有成功。我认为另一种方法是在运行时将其包含在数据中。

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

  1. 重写parameterMap函数-我不建议使用
  2. 捕获寻呼机按钮上的点击,并从点击按钮的HTML中获取数字,并将其记录在变量中

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();
}

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

最新更新