如何让 syncfusion 自定义适配器与 feathers socket.io 客户端一起工作

How do you get a syncfusion custom adapter to work with the feathers socket.io client

羽毛客户端 2.3.0

syncfusion-javascript 15.3.29

我一直在尝试创建一个 syncfusion custom adapter for the feathers socket.io 版本的客户端。我知道我可以使用 rest 来获取数据,但为了让我进行离线同步,我需要使用 feathers-offline-realtime 插件。

我也在 aurelia 项目中使用它,所以我在 babel 中使用 es6 导入。

这是我试过的代码片段,如果需要,我可以 post 全部。

我也不确定仅使用 Adapter 与 UrlAdapter 是否正确,因为我需要排序和分页来访问服务器,而不仅仅是在本地进行。如果我至少可以取回一些数据,我想我可以解决这个问题。

注意: Per Prince Oliver 我正在对这个问题进行澄清,除了 proccessQuery(例如 onSort)之外,我还需要能够调用适配器的任何方法。当数据网格调用 onSort 方法时,我需要能够使用羽毛 socket.io 客户端调用我的 api,因为它以特殊方式处理 socket.io 以实现离线功能。

import io from 'socket.io-client';
import * as feathers from 'feathers-client';
const baseUrl = 'http://localhost:3030';
const socket = io.connect(baseUrl);
const client = feathers.default()
  .configure(feathers.hooks())
  .configure(feathers.socketio(socket));
const customers = client.service('customers');

export class FeathersAdapter {

  feathersAdapter = new ej.Adaptor().extend({

    processQuery: function (ds, query) {

      let results
    makeMeLookSync(function* () {
      results = yield  customers.find();
      console.log(results);
    });

结果未定义。我尝试了其他几种方法,但这个似乎应该有效。

修改后的代码:

我现在正在获取数据,但在我调用

时也出现了如图所示的奇怪错误
 let results = await customers.find();

然后该过程继续,我得到了数据,但是当返回结果变量时,网格中仍然没有数据。

   async processQuery(ds, query) {
      let baseUrl = 'http://localhost:3030';
      let socket = io.connect(baseUrl);

      let client = feathers.default()
        .configure(feathers.hooks())
        .configure(feathers.socketio(socket));

      let customers = client.service('customers');

      let results = await customers.find();

     var result = results, count = result.length, cntFlg = true, ret, key, agg = {};

      for (var i = 0; i < query.queries.length; i++) {
       key = query.queries[i];
       ret = this[key.fn].call(this, result, key.e, query);
        if (key.fn == "onAggregates")
          agg[key.e.field + " - " + key.e.type] = ret;
        else
          result = ret !== undefined ? ret : result;

        if (key.fn === "onPage" || key.fn === "onSkip" || key.fn === "onTake" || key.fn === "onRange") cntFlg = false;

        if (cntFlg) count = result.length;
      }

      return result;

DataManager 中的processQuery 方法用于在获取数据之前处理ej.Query 中设置的参数,如skip、take、page。然后根据这些参数异步获取数据,并在processResponse方法中处理获取的数据,进行过滤或修改等操作。 processQuery 函数同步运行,不等待异步过程完成。因此,从 API 返回的数据没有绑定到 Grid 上并抛出未定义的错误。

因此,如果您使用 socket.io 从 API 获取数据,则可以使用数据源 属性 将数据直接绑定到 Grid 控件。一旦数据源更新了结果,它会通过双向绑定自动反映在网格中。

[HTML]

<template> 
  <div>
    <ej-grid e-data-source.bind="gridData" e-columns.bind="cols"> </ej-grid> 
  </div> 
</template>

[JS]

let baseUrl = 'http://localhost:3030';
let socket = io.connect(baseUrl);

let client = feathers.default()
    .configure(feathers.hooks())
    .configure(feathers.socketio(socket));

let customers = client.service('customers');

let results = await customers.find();

this.gridData = results; // bind the data to Grid