From 5d376ce5c2f3c50349dc8e133c45bded9f27cf04 Mon Sep 17 00:00:00 2001 From: Aleksandr Kanunnikov Date: Sun, 1 Nov 2020 23:01:00 +0300 Subject: [PATCH] fixed glimmer 800 issue --- frameworks/keyed/glimmer-2/src/MyTable.ts | 18 ++++------ frameworks/keyed/glimmer-2/src/TableRow.ts | 2 +- .../glimmer-2/src/utils/benchmark-helpers.ts | 5 +-- .../keyed/glimmer-2/src/utils/helper.ts | 34 +++++++++++++++++++ 4 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 frameworks/keyed/glimmer-2/src/utils/helper.ts diff --git a/frameworks/keyed/glimmer-2/src/MyTable.ts b/frameworks/keyed/glimmer-2/src/MyTable.ts index e50c38ed5..9c4694d21 100644 --- a/frameworks/keyed/glimmer-2/src/MyTable.ts +++ b/frameworks/keyed/glimmer-2/src/MyTable.ts @@ -7,6 +7,11 @@ import { run, runLots, add, update, swapRows, deleteRow } from './utils/benchmar import TableRow from './TableRow'; import BsButton from './BsButton'; +import { helper } from './utils/helper'; + +const eq = helper(([a,b]) => { + return a === b; +}) export default class MyTable extends Component { @tracked id = 1; @@ -47,27 +52,18 @@ export default class MyTable extends Component { } @action remove(id): void { - const selected = this.data.find(({ selected }) => selected === true); - if (selected) { - selected.selected = false; - } this.data = deleteRow(this.data, id); this.selected = undefined; } @action select(id): void { this.selected = id; - const selected = this.data.find(({ selected }) => selected === true); - if (selected) { - selected.selected = false; - } - this.data.find((item) => item.id === id).selected = true; } } setComponentTemplate( createTemplate( - { on, fn, TableRow, BsButton }, + { on, fn, eq, TableRow, BsButton }, `
@@ -112,7 +108,7 @@ setComponentTemplate(
- {{#each this.data key="id" as |item|}}{{/each}} + {{#each this.data key="id" as |item|}}{{/each}}
`), MyTable diff --git a/frameworks/keyed/glimmer-2/src/TableRow.ts b/frameworks/keyed/glimmer-2/src/TableRow.ts index c1fce531b..aacb26fc0 100644 --- a/frameworks/keyed/glimmer-2/src/TableRow.ts +++ b/frameworks/keyed/glimmer-2/src/TableRow.ts @@ -4,7 +4,7 @@ import { createTemplate, setComponentTemplate, templateOnlyComponent } from '@gl export default setComponentTemplate( createTemplate( { on }, - `{{@item.id}}{{@item.label}}` + `{{@item.id}}{{@item.label}}` ), templateOnlyComponent() ); diff --git a/frameworks/keyed/glimmer-2/src/utils/benchmark-helpers.ts b/frameworks/keyed/glimmer-2/src/utils/benchmark-helpers.ts index 03b90aa03..cf766009f 100644 --- a/frameworks/keyed/glimmer-2/src/utils/benchmark-helpers.ts +++ b/frameworks/keyed/glimmer-2/src/utils/benchmark-helpers.ts @@ -2,11 +2,9 @@ import { tracked } from '@glimmer/tracking'; class TodoItem { @tracked label; - @tracked selected; @tracked id; - constructor({ label, selected, id }) { + constructor({ label, id }) { this.label = label; - this.selected = selected; this.id = id; } } @@ -92,7 +90,6 @@ export const buildData = (id, count = 1000): ItemsSnapshot => { data.push( new TodoItem({ id: id++, - selected: false, label: adjectives[_random(adjectives.length)] + ' ' + diff --git a/frameworks/keyed/glimmer-2/src/utils/helper.ts b/frameworks/keyed/glimmer-2/src/utils/helper.ts new file mode 100644 index 000000000..a990c2804 --- /dev/null +++ b/frameworks/keyed/glimmer-2/src/utils/helper.ts @@ -0,0 +1,34 @@ +import { helperCapabilities, HelperManager, setHelperManager } from '@glimmer/core'; + +type helperFunc< + Positional extends unknown[] = unknown[], + Result = unknown +> = (positional: Positional) => Result; + +interface HelperBucket< + Positional extends unknown[] = unknown[], + Result = unknown +> { + fn: helperFunc; + args: any; +} + +class HelperWithServicesManager implements HelperManager { + capabilities = helperCapabilities('glimmerjs-2.0.0'); + + createHelper(fn: helperFunc, args: any): HelperBucket { + return { fn, args }; + } + + getValue(instance: HelperBucket): unknown { + const { args } = instance; + return instance.fn(args.positional); + } +} + +const HelperWithServicesManagerFactory = (): HelperWithServicesManager => new HelperWithServicesManager(); + +export function helper(fn: T): T { + setHelperManager(HelperWithServicesManagerFactory, fn); + return fn; +}