Important: This documentation covers Yarn 1 (Classic).
For Yarn 2+ docs and migration guide, see yarnpkg.com.

Package detail

ember-diff-attrs

workmanw25.7kMIT0.2.3

An ember-addon that provides a dry way to track attribute changes using a component's didReceiveAttrs lifecycle hook.

ember-addon

readme

ember-diff-attrs

This addon was spun out of a discussion on emberjs/rfcs#191 [Deprecate component lifecycle hook arguments].

ember-diff-attrs provides a dry way to track attribute changes using a component's didReceiveAttrs lifecycle hook.

PRs, RFCs and comments are welcome!

ember-did-change-attrs

@GavinJoyce and I (mostly Gavin) created an alternative version of this addon that offers a slightly cleaner API using a mixin instead of a decorator.

See: ember-did-change-attrs

Usage

Shorthand usage

import diffAttrs from 'ember-diff-attrs';

export default Ember.Component.extend({
  didReceiveAttrs: diffAttrs('email', 'isAdmin', function(changedAttrs, ...args) {
    this._super(...args);

    if(changedAttrs && changedAttrs.email) {
      let oldEmail = changedAttrs.email[0],
          newEmail = changedAttrs.email[1];
      // Do stuff
    }
  })
});

Some quick notes:

  • The function hook provided to diffAttrs will always be called, even when a tracked attr is not changed.
  • changedAttrs will be null on the first call.

Extended usage

import diffAttrs from 'ember-diff-attrs';

export default Ember.Component.extend({
  didReceiveAttrs: diffAttrs({
    keys: ['user', 'isAdmin'],
    isEqual(key, a, b) {
      if (key === 'user') {
        return (a && b) ? a.id === b.id : a === b;
      }
      return a === b;
    },
    hook(changedAttrs, ...args) {
      this._super(...args);

      if(changedAttrs && changedAttrs.user) {
        let oldUser = changedAttrs.user[0],
            newUser = changedAttrs.user[1];
        // Do stuff
      }
    }
  })
});

Design thoughts / rationales.

  • changedAttrs null on init -- It seems likely that some users will want an alternate behavior for init vs update. There is no loss of functionality by having changedAttrs null on init and it's easy to explain, nothing has actually changed yet.
  • changedAttrs structure -- I followed the precedence started by ember-data (model.changedAttributes()).

Outstanding Questions

Changed attrs format

I followed ember-data's precedence for representing old and new values (model.changedAttributes()). This format has always felt odd to me. I'm more than happy to discuss changing this.

didUpdateAttrs

Since this addon is implemented as a macro, it cannot easily utilize a component's init call to setup. Because of this, we are unable to determine what has changed the first time didUpdateAttrs is called.

Running tests

  • ember test – Runs the test suite on the current Ember version
  • ember test --server – Runs the test suite in "watch mode"
  • ember try:each – Runs the test suite against multiple Ember versions

Running the dummy application

For more information on using ember-cli, visit https://ember-cli.com/.

License

This project is licensed under the MIT License.

changelog

ember-diff-attrs Changelog

0.2.3 (October 2nd, 2020)

  • #25 Updated yarn.lock (@workmanw)
  • #16 Upgrade ember-cli-babel to v7 (@nlfurniss)

0.2.2 (December 18th, 2018)

  • #14 Removed ember-weakmap (@scalvert, @workmanw)
  • #13 Update ember and ember-cli (@Duder-onomy)

0.2.1 (January 11th, 2018)

  • #9 Upgraded addon packages/structure to match Ember 2.18. Resolves #8 (@workmanw)

0.2.0 (November 11th, 2017)

  • #6 Upgrade ember-weakmap to 3.0 (@ryanto)

0.1.2 (February 19th, 2017)

  • #2 Added ember-weakmap as a dependency (@workmanw)

0.1.1 (February 8th, 2017)

  • Added repository information to the package.json so it could be located by NPM and Ember Observer (@workmanw)

0.1.0 (December 25th, 2016)

  • Initial implementation (@workmanw)