2017-09-04 67 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