npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

ember-tracked-effects-placeholder

v1.3.1

Published

Tracked Effects for Ember

Downloads

45

Readme

ember-tracked-effects-placeholder

Bodged implementation of tracked Effects prior to the availability of the proper implementation.

When tracked data changes the renderer creates a backburner runloop. We hook into the start of every runloop to see if the renderer global tag version has changed. This uses private API.

Based on ideas from @NullVoxPopuli, @lifeart, @Courajs and @jelhan

Compatibility

  • Ember.js v3.28 or above
  • Ember CLI v3.28 or above
  • Node.js v14 or above

Installation

ember install ember-tracked-effects-placeholder

Usage

If you want to update data in a template, or have UI interaction trigger backend behaviour (e.g. calling play() on a <video\> element) then you can use glimmer tracking to update the template, or a modifier to call into UI elements.

Sometimes you need to call functions that are not related to templates.

Tracked Effects allow you to call back end functions without needing to have your code entangled with templates. For example you might have Ember Data models updated by a websocket or any other non-UI triggered data change, and need to call into browser APIs, or embedded platform APIs. In Electron you might want to make changes to the file system based on data changes, or system clock for example.

Usage with a decorator

In a service, use the @effect decorator on a function property. You can use this anywhere but if you're using it in a route or a controller it's likely that a modifier is a better solution.

Note that you must use the syntax myMethod = () => {} and not myMethod() {} due to the way decorators work. However if you get this wrong you'll get a useful error to help you fix it.

import Service from '@ember/service';

export default class MyService extends Service {
  @tracked data: { name: string }; // an ember data model for example

  @effect
  saveToLocalStorage = () => {
    // the tracked effects service will watch any tracked data
    // you read here and will run this function whenever it changes
    browser.localStorage.setItem('my-data', this.data?.name ?? '');
  }
}

Without a decorator

import Service from '@ember/service';
import { TrackedEffectsService } from 'ember-tracked-effects-placeholder';

export default class MyService extends Service {
  @service trackedEffects: TrackedEffectsService;

  @tracked data: { name: string }; // an ember data model for example

  effect = this.trackedEffects.addEffect(
    () => { 
      // the tracked effects service will watch any tracked data
      // you read here and will run this function whenever it changes
      browser.localStorage.setItem('my-data', this.data?.name ?? '');
    },
    this // the service will stop the effect running if the context is destroyed
  );
}

Effects with shorter lifetimes

Maybe you want to stop watching this data at some point. Note that you don't need to do this on destruction, that's automatic if you provide a context when calling addEffect()

import Service from '@ember/service';
import { TrackedEffectsService, TrackedEffect } from 'ember-tracked-effects-placeholder';

export default class MyService extends Service {
  @service trackedEffects: TrackedEffectsService;

  @tracked data: { name: string }; 
  
  private effect = this.trackedEffects.addEffect(
    () => { 
      browser.localStorage.setItem('my-data', this.data?.name ?? '');
    },
    this
  );

  public stopWatching() {
    // stop() removes the effect from the watch system and cleans up
    this.effect.stop();
  }
}

Contributing

See the Contributing guide for details.

License

This project is licensed under the MIT License.