如何获得syncfusion自定义适配器以使用羽毛socket.io client

时间:2017-09-04 00:23:49

标签: syncfusion feathersjs

feathers-client 2.3.0

syncfusion-javascript 15.3.29

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

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

这是我尝试过的代码段,如果需要,我可以发布整个内容。

我也不确定是否只使用Adapter vs UrlAdapter是正确的,因为我需要排序和分页来命中服务器,而不仅仅是在本地执行。如果我至少可以获得一些数据,我想我可以解决这个问题。

注意: Per Prince Oliver我正在为我需要能够调用适配器的任何方法的问题添加一个澄清,除了proccessQuery,例如onSort。当datagrid调用onSort方法时,我需要能够使用feather 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);
    });

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

REVISED CODE:

修订后的代码:

我现在正在获取数据但也有奇怪的错误,如图中所示,当我打电话

 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;

1 个答案:

答案 0 :(得分:0)

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

因此,如果您使用socket.io从API获取数据,则可以使用dataSource属性将数据直接绑定到Grid控件。使用结果更新dataSource后,它将通过双向绑定自动反映在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