Kendo DataSource: как определить вычисляемые свойства для данных, считанных из удаленного источника odata

Ситуация:

  • Кендо Источник данных

    var ordersDataSource = new kendo.data.DataSource({
        type: "odata",
        transport: {
            read: {
                url: "http://localhost/odata.svc/Orders?$expand=OrderDetails"
            }
        },
        schema: {
            type: "json",
            data: function(response){
                return response.value;
            }
            total: function(response){
                return response['odata.count'];
            }
        },
        serverPaging: true,
        serverFiltering: true,
        serverSorting: true
    })
    
  • данные json, считанные из источника odata, выглядят так:

    {
        odata.metadata: "xxxx",
        odata.count: "5",
        value: [
            {
                OrderId: 1,
                OrderedDate: "2013-02-20",
                OrderInfoA: "Info A",
                OrderInfoB: "Info B"
                OrderDetails: [
                    {
                        OrderDetailId: 6,
                        OrderDetailInfoC: "Info C",
                        OrderDetailInfoD: "Info D"
                    },
                    {
                        //Another OrderDetail's data
                    }
                ]
            },
            {
                // Another Order's data
            }
        ]
    }
    

Вопрос 1:

1. Если я хочу определить "вычисляемое" свойство: OrderedDateRelative, которое должно быть количеством дней между сегодняшним днем ​​(2013-02-25) и днем ​​создания заказа (2013-02-20). ), Например: "5 дней назад", КАК я могу добиться этого на стороне клиента?

Ответ на вопрос 1: http://jsbin.com/ojomul/7/edit

Вопрос 2 --ОБНОВЛЕНИЕ--

2. Каждый заказ имеет свое вложенное свойство OrderDetails, поэтому можно ли определить вычисляемое поле для вложенного свойства OrderDetails? Например: OrderDetailInfoCAndD для каждого OrderDetail, и значение должно быть примерно таким: OrderDetailInfoC + OrderDetailInfoD, то есть "Info C Info D"?

Спасибо,

декан


person Dean    schedule 25.02.2013    source источник
comment
+1 за вопрос 2, на который до сих пор нет ответа.   -  person zacharydl    schedule 08.01.2014


Ответы (3)


Вы можете создать вычисляемое поле, указав модель источника данных:

  dataSource = new kendo.data.DataSource({
    data: [
      { first: "John", last: "Doe" }, 
      { first: "Jane", last: "Doe" }
    ],
    schema: {
      model: {
        // Calculated field
        fullName: function() {
          return this.get("first") + " " + this.get("last");
        }
      }
    }
  });

Вот живая демонстрация: http://jsbin.com/ojomul/1/edit.

person Atanas Korchev    schedule 25.02.2013
comment
Привет, я отредактировал вашу демонстрацию, jsbin.com/ojomul/4/edit, CalculatedField не правильно показывает. - person Dean; 25.02.2013
comment
Это функция - вам нужно вызвать ее CalculatedField() - person Atanas Korchev; 25.02.2013
comment
Да, вызовите его, поскольку функция работает, спасибо. Другой вопрос: можем ли мы сделать что-то похожее на вложенное свойство OrderDetails? См. мой обновленный Вопрос 2, плз. - person Dean; 26.02.2013
comment
Можете ли вы указать тип, чтобы фильтры работали правильно? Например, указать тип как логический, дату и т. Д. По умолчанию он обрабатывается как строка. - person Xavier John; 27.08.2014

Вот способ использования вычисляемого поля в Kendo Grid.

var crudServiceBaseUrl = "http://demos.telerik.com/kendo-ui/service",
dataSource = new kendo.data.DataSource({
    transport: {
        read: {
            url: crudServiceBaseUrl + "/Products",
            dataType: "jsonp"
        }
    },
    pageSize: 20,
    schema: {
        model: {
            total: function (item) {
                return this.UnitPrice * this.UnitsInStock;
            }
        }
    }
});

$("#grid").kendoGrid({
    dataSource: dataSource,
    pageable: true,
    height: 550,
    sortable: true,
    filterable: true,
    toolbar: ["create"],
    columns: [
        { field: "UnitPrice", title: "Unit Price"},
        { field: "UnitsInStock", title: "Units In Stock", width: "120px" },
        { field: "total()", title: "Total" }]
});
person Xavier John    schedule 27.08.2014

Ниже пример использования его в сетке. Затем он также может сортировать столбец.

$("#grid").kendoGrid({ 
    dataSource: {
        data: [
            { first: "John", last: "Doe" }, 
            { first: "Jane", last: "Doe" }
        ],
        schema: {
          model: {
            // Calculated field
            fullName: function() {
              return this.first + " " + this.last;
            },
            fields: {
               first: { type: "string" },
               last: { type: "string" }
            }
          }
        }
    },
    columns: [
        {
            // Trigger function of the Calculated field
            field: "fullName()",
            title: "Fullname"
        },
        {
            field: "first",
            title: "firstname"
        }
    ]
});
person Wow    schedule 19.01.2016