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);
});
结果未定义。我已经尝试了其他几种方法,但这个似乎应该可行。
修订后的代码:
我现在正在获取数据但也有奇怪的错误,如图中所示,当我打电话
时 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 :(得分: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