Fork me on GitHub
#re-frame
<
2021-06-15
>
wombawomba09:06:05

I'm trying to call document.querySelector("#my-id").scrollIntoView() for a url that goes to a different view (from /my-view to /my-other-view#my-id) by dispatching two effects (`[:navigate-to "my-other-view"]` followed by [:scroll-to "my-id"]). Unfortunately this doesn't work because the :scroll-to event is fired before the corresponding element exists (both events seem to fire as a batch, before the view is rendered). Is there a way to ensure that the :scroll-to effect doesn't get applied until after the view has been re-rendered?

p-himik10:06:23

Yes. By not using the effect and instead calling scrollIntoView inside the component itself.

p-himik10:06:39

I would 100% not use re-frame machinery for this particular task.

wombawomba10:06:55

Yeah I think that's what I'll end up having to do

p-himik10:06:15

And, of course, before calling the scroll function you would have to check that the URL fragment points to the relevant view.

wombawomba10:06:06

I had this solution in place for moving around an already loaded page (where it works fine), and was hoping for a quick fix so I wouldn't have to redesign it right away

p-himik10:06:12

I've been in your shoes before, and I don't think there's a proper fix here. There's a dirty workaround - just firing up setInterval and checking if the element exists.

wombawomba10:06:20

Yeah okay, thanks 🙂

pinkfrog14:06:19

I have a question on http-fx. So here: https://github.com/day8/re-frame-http-fx#step-3a-handling-on-success I have to write a global callback for each http call? Seems quite clumsy?

p-himik14:06:58

You're using that fx in an event handler that's also available globally. Same thing.

pinkfrog14:06:08

This comes clumsy when

(defn some-func []
  (call-http-1)
  (use-the above-http-result)
  (call-http-2 with the above transformed result))
So we have to write lots of call backs here for a specific purpose.

p-himik14:06:29

Zero clue what you mean with that code, to be honest.

pinkfrog14:06:43

(defn some-func []
  (-> (call-http-1)
      (use-the-above-http-result)
      (call-http-2 with the above transformed result)))

pinkfrog14:06:27

Maybe more direct. So if I want to make several http requests with the later depending on the further. It is a little bit verbose to go with the (dispath [:response-handler]) approach.

p-himik14:06:33

Events in re-frame are in general indeed a bit more verbose when you need to chain then. That's a given, regardless of whether you're using re-frame-http-fx or not. There are libraries that try to alleviate that, like https://github.com/ingesolvoll/re-chain for example.

pinkfrog14:06:16

Thanks. It’s a quite niche package. How do you get to know that?

p-himik14:06:21

You mean, how I found that library? No clue. I just hoard and catalog all links that I see that seem to be useful. So probably someone mentioned it here before.

p-himik14:06:50

Also, the same guy is behind kee-frame, which I use - so maybe that's how I know about it.

Braden Shepherdson19:06:32

alas, re-frame-10x doesn't work in a sandboxed iframe, which is part of my (admittedly unusual) app architecture.

2
Braden Shepherdson19:06:09

is there any hope of making that a soft requirement, maybe with degraded functionality? or is it vital to how 10x works?