如何让 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
羽毛客户端 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