UNPKG

ember-m3

Version:

Alternative to @ember-data/model in which attributes and relationships are derived from API Payloads

54 lines (45 loc) 1.4 kB
import Ember from 'ember'; import { notifyPropertyChange } from '@ember/object'; import { assert } from '@ember/debug'; import { DEBUG } from '@glimmer/env'; const { changeProperties } = Ember; // WeakMap<Store, [obj, property: string]> const StoreToPropChanges = new WeakMap(); function getPropertyChanges(store) { if (!StoreToPropChanges.has(store)) { StoreToPropChanges.set(store, []); } return StoreToPropChanges.get(store); } export function deferPropertyChange(store, obj, key) { getPropertyChanges(store).push(obj, key); } export function deferArrayPropertyChange(store, array) { deferPropertyChange(store, array, '[]'); } function flushPropChanges(store) { let changes = StoreToPropChanges.get(store) || []; changeProperties(() => { for (let i = 0; i < changes.length; i += 2) { let obj = changes[i]; let change = changes[i + 1]; notifyPropertyChange(obj, change); } }); StoreToPropChanges.set(store, []); } export function flushChanges(store) { changeProperties(() => { flushPropChanges(store); }); } export function assertNoChanges(store) { if (DEBUG) { let propChanges = StoreToPropChanges.get(store) || []; let changedProps = propChanges.filter((_o, i) => i % 2 === 1); assert( `There should be no queued changes, but we have: ${changedProps.join(', ')} `, changedProps.length === 0 ); } }