【问题标题】:Access datasource.page() while parsing dataset解析数据集时访问 datasource.page()
【发布时间】:2014-03-03 16:46:58
【问题描述】:

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

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 从数据集中获取整个记录。在详细视图中,用户可以使用 Next/Prev 按钮来翻阅详细记录,而无需返回到列表视图。这很好用,但如果用户到达数据源的边界,我需要知道他们从哪个页面开始,以便手动调用 datasource.page(x)。我尝试通过数据源对象返回,但没有成功。我认为另一种方法是在运行时将其包含在数据中。

【问题讨论】:

  • 如果使用 ds.page() 会怎样?
  • ds.page() 显示上一次调用的页码。
  • 但是您真的需要将页面添加到您的模型中吗?如果您更改订单,添加/删除记录,......怎么办?或者您只需要检索change 事件中的页码?
  • @OnaBai,我已经更新了问题以澄清。数据源是只读源(至少在本次使用中),因此重新排序不是问题。到 change 事件触发时,数据已返回。

标签: jquery kendo-ui kendo-mobile


【解决方案1】:

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

  1. 重写 parameterMap 函数 - 我不推荐这样做
  2. 捕获对寻呼按钮的点击,并从被点击按钮的 HTML 中获取数字并将其记录到变量中

【讨论】:

  • 我正在使用启用了 loadMore 的列表视图,因此没有寻呼机按钮 :(
【解决方案2】:

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 的记录,但结果会被过滤掉之后 @987654331 @所以,再次,页码是错误的。

如果您确实需要获取change 事件的页码,那么您只需这样做:

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

正如@PeturSubev 建议的那样。

编辑:

随着问题版本中提供的附加信息,您似乎需要在打开详细视图时返回列表所在的页面。这实际上并不意味着您已经移动了页面。如果点击next时没有选择下一项,则会保留原来的页面。

在这里查看: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();
}

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

【讨论】:

  • 好的。我在 parse() 函数之外尝试了@Peter 的代码——也许那是我的问题。我会试试这个并回帖。
  • 不。我正在使用 serverpaging,所以 elem.Page = Math.floor(idx / ds.options.pageSize); 不起作用,因为数据是以块的形式返回的。
  • 哇。很好的例子。但是,我仍然认为这不会起作用,因为我正在使用服务器分页。 idx 与返回的数据相关,我从我的 API 获得多个 50 条记录的块,对于每个块,idx 重新开始。我明天试试看是否可行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-19
相关资源
最近更新 更多