我正在尝试向我的数据源结果添加页面字段。我使用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)。我试图通过数据源对象回来,没有运气。我认为另一种方法是在运行时将其包含在数据中。
答案 0 :(得分:0)
您无法通过dataSource对象获取它。唯一可能的方法是通过以下方式记录该页面:
答案 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/),我们只会显示City
为London
但结果被过滤掉之后的结果 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();
}
如您所见,只要您不选择项目,就不需要返回原始页面。