「Wijmo」の版間の差分
ナビゲーションに移動
検索に移動
(→Sample) |
|||
(同じ利用者による、間の2版が非表示) | |||
1行目: | 1行目: | ||
− | + | ==Wijmo== | |
− | + | | [[Angular]] | | |
− | + | ===[[Angular]] クイックスタート=== | |
*https://demo.grapecity.com/wijmo/docs/GettingStarted/QuickStart/QuickStart-Angular | *https://demo.grapecity.com/wijmo/docs/GettingStarted/QuickStart/QuickStart-Angular | ||
− | + | ===インストール=== | |
<pre> | <pre> | ||
$ npm install @grapecity/wijmo.all | $ npm install @grapecity/wijmo.all | ||
+ | </pre> | ||
+ | |||
+ | ===Sample=== | ||
+ | * https://github.com/pppiroto/visappproto | ||
+ | |||
+ | ==[[Angular]]== | ||
+ | ===オートコンプリートでthisが見えない(コンポーネントでない)=== | ||
+ | <pre> | ||
+ | <wj-auto-complete #theAutoComplete id="autoFirstName" | ||
+ | [placeholder]="'FIRST_NAME'" | ||
+ | [displayMemberPath]="'masterValue'" | ||
+ | [itemsSourceFunction]="getFirstNameBySearch"> | ||
+ | </wj-auto-complete> | ||
+ | </pre> | ||
+ | |||
+ | <pre> | ||
+ | import { Component, Inject, OnInit, ViewChild } from '@angular/core'; | ||
+ | import * as wjcCore from '@grapecity/wijmo'; | ||
+ | import * as wjcGrid from '@grapecity/wijmo.grid'; | ||
+ | import * as input from '@grapecity/wijmo.input'; | ||
+ | |||
+ | import { Employee } from '../../models/employee'; | ||
+ | import { EmployeeService } from '../../services/employee.service'; | ||
+ | import { MasterKeyValue } from 'src/app/models/masterKeyValue'; | ||
+ | import { MasterService } from 'src/app/services/master.service'; | ||
+ | |||
+ | @Component({ | ||
+ | selector: 'app-employees', | ||
+ | templateUrl: './employees.component.html', | ||
+ | styleUrls: ['./employees.component.css'], | ||
+ | }) | ||
+ | export class EmployeesComponent implements OnInit { | ||
+ | |||
+ | public employees: Employee[] = []; | ||
+ | selectedItem: string = ""; | ||
+ | jobIdList: string[] = []; | ||
+ | jobId: string = ""; | ||
+ | |||
+ | @ViewChild('flex', { static: true }) | ||
+ | flex!: wjcGrid.FlexGrid; | ||
+ | |||
+ | constructor(private masterService: MasterService, private employeeService: EmployeeService) { | ||
+ | console.log('constructor'); | ||
+ | console.log(`${this.employeeService.getBaseUrl()}`); | ||
+ | } | ||
+ | |||
+ | flexInitialized(flexgrid: wjcGrid.FlexGrid) { | ||
+ | // sort the data by country | ||
+ | let sd = new wjcCore.SortDescription('employeeId', true); | ||
+ | flexgrid.collectionView.sortDescriptions.push(sd); | ||
+ | flexgrid.collectionView.currentChanged.addHandler(this._updateCurrentInfo.bind(this)); | ||
+ | this._updateCurrentInfo(); | ||
+ | } | ||
+ | |||
+ | private _updateCurrentInfo() { | ||
+ | console.log(`this.employeeService = ${this.employeeService}`); | ||
+ | // this.selectedItem = wjcCore.format( | ||
+ | // '国: <b>{country}</b>、売上: <b>{sales:c0}</b>、費用: <b>{expenses:c0}</b>', | ||
+ | // this.flex.collectionView.currentItem); | ||
+ | } | ||
+ | |||
+ | // JOB_ID データソースロード | ||
+ | async loadJobIdList() { | ||
+ | try { | ||
+ | let jobIdList: MasterKeyValue[] | ||
+ | = await this.masterService.getJobIdList().toPromise(); | ||
+ | let buf: string[] = []; | ||
+ | jobIdList.forEach((mst, idx) => buf.push(`${mst.masterValue}`)); | ||
+ | this.jobIdList = buf; | ||
+ | } catch (error) { | ||
+ | console.log(error); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | getFirstNameBySearch(query: string, max: number, callback: Function) { | ||
+ | console.log(this); // this -> AutoCompleteコントロール | ||
+ | |||
+ | if (!query) { | ||
+ | callback(null); | ||
+ | return; | ||
+ | } | ||
+ | |||
+ | // TODO Service で処理をしたい | ||
+ | // 本関数は、AutoComplete のプロパティにセットされるため、 | ||
+ | // ComponentにDIされてたサービスの参照方法が現在不明 | ||
+ | // 最悪この書き方だとしても、同様にDIされるbaseURL を解決する必要がある。。。 | ||
+ | // | ||
+ | // Function.prototype.bind() を利用して、変数を束縛する | ||
+ | // https://typescript-jp.gitbook.io/deep-dive/main-1/bind | ||
+ | // アロー関数のチェーン | ||
+ | // https://typescript-jp.gitbook.io/deep-dive/main-1/currying | ||
+ | wjcCore.httpRequest(`https://localhost:44472/Autocomplete/EmployeeFirstname?id=${encodeURIComponent(query)}`, { | ||
+ | success: (xhr: XMLHttpRequest) => { | ||
+ | let response = JSON.parse(xhr.response); | ||
+ | callback(response); | ||
+ | } | ||
+ | }); | ||
+ | } | ||
+ | // Service 使用に書き換え From | ||
+ | async getFirstNameBySearchBindComponent(thisComponent: EmployeesComponent, query: string, max: number, callback: Function) { | ||
+ | console.log(thisComponent.employeeService); | ||
+ | if (!query) { | ||
+ | callback(null); | ||
+ | return; | ||
+ | } | ||
+ | try { | ||
+ | let result = await this.masterService.firstNameAutoComplete(query).toPromise(); | ||
+ | console.log(result); | ||
+ | callback(result); | ||
+ | } catch(error) { | ||
+ | console.error(error); | ||
+ | } | ||
+ | } | ||
+ | getFirstNameBySearch2: Function = (query: string, max: number, callback: Function) => | ||
+ | this.getFirstNameBySearchBindComponent(this, query, max, callback); | ||
+ | // Service 使用に書き換え To | ||
+ | |||
+ | async searchSync() { | ||
+ | this.employees.splice(0); | ||
+ | this.employees = []; | ||
+ | |||
+ | // Observable は宣言型で、購読するまで処理が開始されない。Promise は作成時に直ちに実行 | ||
+ | // Observable は多くの値を提供します。Promise は1つです | ||
+ | try { | ||
+ | this.employees = await this.employeeService.getEmployees().toPromise(); | ||
+ | } catch(error) { | ||
+ | console.error(error); | ||
+ | } | ||
+ | } | ||
+ | |||
+ | searchASync() { | ||
+ | this.employees.splice(0); | ||
+ | this.employees = []; | ||
+ | |||
+ | this.employeeService.getEmployees().subscribe( | ||
+ | result => { | ||
+ | this.employees = result; | ||
+ | }, | ||
+ | error => { | ||
+ | console.error(error); | ||
+ | }); | ||
+ | } | ||
+ | |||
+ | ngOnInit(): void { | ||
+ | this.loadJobIdList(); | ||
+ | } | ||
+ | |||
+ | } | ||
</pre> | </pre> |
2022年11月14日 (月) 11:21時点における最新版
Wijmo
| Angular |
Angular クイックスタート
インストール
$ npm install @grapecity/wijmo.all
Sample
Angular
オートコンプリートでthisが見えない(コンポーネントでない)
<wj-auto-complete #theAutoComplete id="autoFirstName" [placeholder]="'FIRST_NAME'" [displayMemberPath]="'masterValue'" [itemsSourceFunction]="getFirstNameBySearch"> </wj-auto-complete>
import { Component, Inject, OnInit, ViewChild } from '@angular/core'; import * as wjcCore from '@grapecity/wijmo'; import * as wjcGrid from '@grapecity/wijmo.grid'; import * as input from '@grapecity/wijmo.input'; import { Employee } from '../../models/employee'; import { EmployeeService } from '../../services/employee.service'; import { MasterKeyValue } from 'src/app/models/masterKeyValue'; import { MasterService } from 'src/app/services/master.service'; @Component({ selector: 'app-employees', templateUrl: './employees.component.html', styleUrls: ['./employees.component.css'], }) export class EmployeesComponent implements OnInit { public employees: Employee[] = []; selectedItem: string = ""; jobIdList: string[] = []; jobId: string = ""; @ViewChild('flex', { static: true }) flex!: wjcGrid.FlexGrid; constructor(private masterService: MasterService, private employeeService: EmployeeService) { console.log('constructor'); console.log(`${this.employeeService.getBaseUrl()}`); } flexInitialized(flexgrid: wjcGrid.FlexGrid) { // sort the data by country let sd = new wjcCore.SortDescription('employeeId', true); flexgrid.collectionView.sortDescriptions.push(sd); flexgrid.collectionView.currentChanged.addHandler(this._updateCurrentInfo.bind(this)); this._updateCurrentInfo(); } private _updateCurrentInfo() { console.log(`this.employeeService = ${this.employeeService}`); // this.selectedItem = wjcCore.format( // '国: <b>{country}</b>、売上: <b>{sales:c0}</b>、費用: <b>{expenses:c0}</b>', // this.flex.collectionView.currentItem); } // JOB_ID データソースロード async loadJobIdList() { try { let jobIdList: MasterKeyValue[] = await this.masterService.getJobIdList().toPromise(); let buf: string[] = []; jobIdList.forEach((mst, idx) => buf.push(`${mst.masterValue}`)); this.jobIdList = buf; } catch (error) { console.log(error); } } getFirstNameBySearch(query: string, max: number, callback: Function) { console.log(this); // this -> AutoCompleteコントロール if (!query) { callback(null); return; } // TODO Service で処理をしたい // 本関数は、AutoComplete のプロパティにセットされるため、 // ComponentにDIされてたサービスの参照方法が現在不明 // 最悪この書き方だとしても、同様にDIされるbaseURL を解決する必要がある。。。 // // Function.prototype.bind() を利用して、変数を束縛する // https://typescript-jp.gitbook.io/deep-dive/main-1/bind // アロー関数のチェーン // https://typescript-jp.gitbook.io/deep-dive/main-1/currying wjcCore.httpRequest(`https://localhost:44472/Autocomplete/EmployeeFirstname?id=${encodeURIComponent(query)}`, { success: (xhr: XMLHttpRequest) => { let response = JSON.parse(xhr.response); callback(response); } }); } // Service 使用に書き換え From async getFirstNameBySearchBindComponent(thisComponent: EmployeesComponent, query: string, max: number, callback: Function) { console.log(thisComponent.employeeService); if (!query) { callback(null); return; } try { let result = await this.masterService.firstNameAutoComplete(query).toPromise(); console.log(result); callback(result); } catch(error) { console.error(error); } } getFirstNameBySearch2: Function = (query: string, max: number, callback: Function) => this.getFirstNameBySearchBindComponent(this, query, max, callback); // Service 使用に書き換え To async searchSync() { this.employees.splice(0); this.employees = []; // Observable は宣言型で、購読するまで処理が開始されない。Promise は作成時に直ちに実行 // Observable は多くの値を提供します。Promise は1つです try { this.employees = await this.employeeService.getEmployees().toPromise(); } catch(error) { console.error(error); } } searchASync() { this.employees.splice(0); this.employees = []; this.employeeService.getEmployees().subscribe( result => { this.employees = result; }, error => { console.error(error); }); } ngOnInit(): void { this.loadJobIdList(); } }
© 2006 矢木浩人