2017-09-04 48 views
0

羽毛客户端2.3.0你如何获得一个syncfusion自定义适配器与羽毛socket.io客户

syncfusion JavaScript的29年3月15日

我一直在尝试了一段时间,以创建一个syncfusion custom adapter工作为其客户端的feathers socket.io版本。我知道我可以使用休息来获取数据,但为了让我做脱机同步,我需要使用feathers-offline-realtime插件。

此外,我在一个aurelia项目中使用这个,所以我使用es6与巴贝尔进口。

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

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

注意: Per Prince Oliver我给问题添加了一个说明,我需要能够调用适配器的任何方法以及只有proccessQuery,如onSort。当datagrid调用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); 
    }); 

结果是未定义的。我尝试了其他几种方法,但是这个看起来应该是可行的。

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; 

回答

0

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

因此,如果您使用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 
+0

我明白你说什么,我知道你能做到这一点,但不给你,例如使用的onSort的能力适配器的方法,然后用排序方法调用api。上面的代码只是将数据绑定到适配器之外。 – dan

+0

王子,我添加了一个便条,请让我知道,如果这澄清了你的问题,或者如果我需要说一些不同的东西 – dan