Comments (3)
@AndrejSperling That seems like a decent approach to me given what I know of your app so far.
I suppose the original question was answered so I'll close this issue. :)
from cycle-onionify.
Hi @AndrejSperling! Glad to hear you are starting with reactive programming and I hope to help you in your journey (if you need more quick help, the gitter chat for Cycle.js is great)
With Cycle.js, it helps to think "all external reads come from sources" and "all external writes go to sinks". So in this case, you want to
- read the current state and
- write an http request.
So you need to
- use sources.onion to get the state
- produce a stream of http request to send as sink
This is already half of the solution. I noticed you have submitReducer$
depending on intent.submit$
but the reducer itself is just a clone of the previous state. Reducers are for writing state, but submitReducer$
is not actually performing a reasonable write. (Important detail: that said, reducers are functions that read the previous state and deliver the new state, but you should view this as just a transaction, like a database transaction) Also, submitReducer$
should not be used for reading state as you attempted with const submitForm$ = submitReducer$.map(
.
So it seems to me the solution should look like
const submitForm$ = intent.submit$
.compose(sampleCombine(sources.onion.state$))
.map(([submitEvent, state]) => ({
url: 'http://localhost:8080/api/notecard',
method: 'POST',
category: 'post-notecard',
send: {
'title': state.title,
'description': state.description,
'tags': state.tags,
}
}))
The key here is to use the sampleCombine operator from xstream. It makes the output emit only when intent.submit$
emits, but samples the latest state from sources.onion.state$
. This will make the submitForm$
which we use as a sink in order to write an HTTP request.
Does that answer?
from cycle-onionify.
Thank you for the detailed answer. It helped me to understand the concept even better. Everything works fine now.
If you don't mind to answer. What would the best way to validate the form data?
Is it a good practise to save the errors in state? Or would a extra stream be better?
Currently I changed the functionality of submitReducer$
to validate the state by saving the errors in state.
const submitReducer$: Stream<Reducer> = intent.submit$
.map(submit => function submitReducer(state) {
if (state.title == "") {
state = Object.assign({}, state, {
errors: {
title: "Title is required"
}
});
}
...
return state;
});
from cycle-onionify.
Related Issues (20)
- pickCombine fails when re-adding item with same key HOT 1
- Possible to not emit until default reducer gets run? HOT 7
- Rename lens getter/setter HOT 8
- Help needed - MemoryStream.map not producing output HOT 1
- Add mock-onionify HOT 4
- Remove the .vscode folder
- Why don't provide 'pick' and 'mix' functions in xstream? HOT 4
- Shouldn't collections docs be in readme as well as release notes? HOT 2
- Add ES6 module build
- "Reducer" term is not correct HOT 1
- pickMerge throws error if child is not using sink HOT 1
- pickMerge seems to swallow events HOT 6
- type MakeScopesFn does not exist but imported HOT 1
- Shouldn't state emissions be microtask queued? HOT 6
- emitting `xs.never` with pickCombine might be wrong HOT 13
- Action stream is probably a better definition than `reducer` stream. HOT 4
- onionify typings assume "onion" as key HOT 1
- cycle-onionify when can update for rxjs@6
- cannot compile typescript examples HOT 1
- Define Omit<T, K> properly? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from cycle-onionify.