Github user benkeen commented on a diff in the pull request:

    https://github.com/apache/couchdb-fauxton/pull/434#discussion_r31858594
  
    --- Diff: app/addons/dashboard/components.react.jsx ---
    @@ -0,0 +1,190 @@
    +// Licensed under the Apache License, Version 2.0 (the "License"); you may 
not
    +// use this file except in compliance with the License. You may obtain a 
copy of
    +// the License at
    +//
    +//   http://www.apache.org/licenses/LICENSE-2.0
    +//
    +// Unless required by applicable law or agreed to in writing, software
    +// distributed under the License is distributed on an "AS IS" BASIS, 
WITHOUT
    +// WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
    +// License for the specific language governing permissions and limitations 
under
    +// the License.
    +
    +define([
    +  'app',
    +  'api',
    +  'react',
    +  'addons/dashboard/stores'
    +], function (App, FauxtonAPI, React, Store) {
    +
    +  var activeTaskList = Store.dashboardStore;
    +
    +  var DashboardController = React.createClass({
    +
    +    getStoreState: function () {
    +      return {
    +        collection: activeTaskList.getCollection(),
    +
    +        setPolling: activeTaskList.setPolling,
    --- End diff --
    
    Sure! Sorry for the wait in responding. This'll take a bit of explanation, 
so sorry for the long message.
    
    One of the ideas in the [flux 
pattern](https://facebook.github.io/flux/docs/overview.html) (which we use in 
Fauxton) is to have one-way communication as shown in the [diagram 
here](https://github.com/facebook/flux). Information flows one-way, like so:
    
    1. User clicks on something in a React component,
    2. the component fires an action (in an `actions.js` file),
    3. the action dispatches an event (for us, that's the 
`FauxtonAPI.dispatch()` call),
    4. stores listen to these events (in their `dispatch()` methods), change 
the content of the store, then notify anyone that's interested that the store 
has changed.
    5. finally, it comes full circle. React components listen for changes in 
the store by listening to their change events. That's the purpose of the 
`storeName.on('change', this.onChange)` lines.
    
    You're already doing this in your `DashboardController` component, just not 
for every item in its state.
    
    So why do all this. The benefit is that it standardizes how data moves 
around the application, and keeps things simple - regardless of how much bigger 
the application gets. This is pretty cool.
    
    Here's a simple example: imagine if a user shrunk/expanded the main 
sidebar, and multiple components in the page needed to know about it to make 
use of the new space. Maybe one was a graph and needed to redraw for the extra 
space, and maybe another component could switch from "basic" to "advanced" view 
or something.
    
    With flux, you can just publish the *single* event, then each store could 
listen for it, change whatever data was needed internally, then notify any 
components that was listening: and they would then have the choice to rerender 
or not, based on what changed. By setting content on the store directly like 
you're doing here, it ties the component to the individual store and blocks out 
any other stores which may be interested in the event down the road. Now true, 
that may be unimportant in certain cases, but by doing it consistently 
everywhere, it makes the whole application super, super easy to follow (albeit 
a bit verbose at times!).
    
    So what you need to do is replace the `this.state.setPolling();` and 
`this.state.clearPolling();` lines with `Actions.setPolling()` and 
`Actions.clearPolling()` methods (and include your actions.js file in your 
`components.react.jsx` file as a dependency). In the `actions.js` file, add 
those methods, which just dispatch two new event - just like you're already 
doing there - defined in your actiontypes.js file. Then update the store's 
`dispatch()` method to listen to them, and do a `this.triggerChange();`. Lastly 
you can remove `setPolling` and `clearPolling` from your component's 
`getStoreState()` method.
    
    It feels a bit weird at first adding in all this extra code for something 
that works already, but it'll be better down the road!


---
If your project is set up for it, you can reply to this email and have your
reply appear on GitHub as well. If your project does not have this feature
enabled and wishes so, or if the feature is enabled but not working, please
contact infrastructure at [email protected] or file a JIRA ticket
with INFRA.
---

Reply via email to