Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Allow programmatic control of observation #397

Merged
merged 2 commits into from
Jun 28, 2021

Conversation

chriskrycho
Copy link
Contributor

Add a named new argument, isObserving, with a default value of true, which users can pass to explicitly opt into or out of observing an element at a given time. This allows for a declarative invocation of the modifier itself based on tracked state, rather than having to handle it in the callback(s) passed to the modifier.

Users can work around this today by only passing the onEnter or onExit callbacks conditionally:

<div
  {{did-intersect
    onEnter=(if this.shouldDoSomething this.doSomething no-op)
    onExist=(if this.shouldDoSomething this.doSomethingElse no-op)
  }}
>

However, as this example shows, this is repetive (and potentially error- prone). The new functionality allows a less error-prone, less repetitive, more expressive approach:

<div
  {{did-intersect
    isObserving=this.shouldDoSomething
    onEnter=this.doSomething
    onExit=this.doSomethingElse
  }}
>

Resolves #396

Add a named new argument, `isObserving`, with a default value of
`true`, which users can pass to explicitly opt into or out of observing
an element at a given time. This allows for a declarative invocation of
the modifier itself based on tracked state, rather than having to handle
it in the callback(s) passed to the modifier.

Users can work around this today by only passing the `onEnter` or
`onExit` callbacks conditionally:

    <div
      {{did-intersect
        onEnter=(if this.shouldDoSomething this.doSomething no-op)
        onExist=(if this.shouldDoSomething this.doSomethingElse no-op)
      }}
    >

However, as this example shows, this is repetive (and potentially
error- prone). The new functionality allows a less error-prone, less
repetitive, more expressive approach:

    <div
      {{did-intersect
      	isObserving=this.shouldDoSomething
        onEnter=this.doSomething
        onExit=this.doSomethingElse
      }}
    >

Resolves elwayman02#396

module('modifier accepts `isObserving` argument', function () {
test('with a truth(y) value', async function (assert) {
assert.expect(2);
Copy link
Owner

@elwayman02 elwayman02 Jun 24, 2021

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Prefer not to use assert.expect for tests where the assertions are always called synchronously rather than in callbacks. This makes the tests brittle to change without adding a lot of value, in my experience.

(Yes, I know a few of those snuck through above. I missed them in previous reviews :( )

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can fix this in another PR, since it needs to be updated everywhere.

Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Filed #398

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Heh, I am 100% in agreement; I added it solely to match the existing tests I saw. 😅

@elwayman02
Copy link
Owner

@chriskrycho can you add an example to the demo app and update the docs to include this option? I'm thinking maybe you could add a button to the existing example that toggles observing on and off and renders the current state of the toggle to the user?

@chriskrycho
Copy link
Contributor Author

Happy to! Will push changes to that effect shortly.

@elwayman02
Copy link
Owner

The demo looks great!

@elwayman02 elwayman02 merged commit 0c6a22b into elwayman02:master Jun 28, 2021
@elwayman02 elwayman02 added the enhancement New feature or request label Jun 28, 2021
@chriskrycho chriskrycho deleted the programmatic-observation branch June 28, 2021 19:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Feature suggestion: programmatic control over observation
2 participants