2.7 KiB
Publish/subscribe pattern
Handling DOM updates after AJAX database manipulation
As an example, let us consider the manipulation (create, update...) of StockArticles
. This can be done in different views, e.g., stock_articles/index
, stock_articles/show
and deliveries/_form
through modals using AJAX requests. As an advantage of the AJAX technique, the user does not need to reload the entire page. However, (after the update of the StockArticle
in the database) it is generally required to update the DOM in the current view such that the page properly reacts to the asynchronous actions.
The process can be divided in two steps: 1. AJAX database manipulation and 2. DOM updates for the particular view. The crucial point is the coupling of the two steps since the controller for the first step offers the same functionality to all views and does not need to know anything about the current view.
-
AJAX database manipulation
-
Example: current view
deliveries/_form
offers a link for the AJAX actionStockArticle#new
. This opens a modal filled withstock_articles/_form
. -
AJAX form post addresses the
StockArticle#create
action which handles the database manipulation. -
The database manipulation is finished by the rendering of, e.g.,
stock_articles/create.js.erb
. The key task there is to publish the database changes by callingtrigger
, i.e.,$(document).trigger({ type: 'StockArticle#create', stock_article_id: <%= @stock_article.id %> });
-
-
DOM updates for the particular view
-
Each view has the opportunity to subscribe to particular events of the previous step. A very simple example is the update of the
stock_articles/index
view afterStockArticle#destroy
:$(document).on('StockArticle#destroy', function(e) { $('#stockArticle-' + e.stock_article_id).remove(); });
However, in most of the situations you will like to use the full power of the MVC framework in order to read new data from the database and render some partial. Let us consider this slightly more advanced case in the following.
The view
stock_articles/index
could listen (amongst others) toStockArticle#create
like this:$(document).on('StockArticle#create', function(e) { $.ajax({ url: '#{index_on_stock_article_create_stock_articles_path}', type: 'get', data: {id: e.stock_article_id}, contentType: 'application/json; charset=UTF-8' }); });
- The action
StockArticles#index_on_stock_article_create
is a special helper action to handle DOM updates of thestock_articles/index
view after the creation of a newStockArticle
with the givenid
.
-