Digging

Beyond full page navigation, Superglue can make selective updates to parts of the page without a full load through digging. You may recognize digging from earlier docs:

/some_current_page?props_at=data.rightDrawer.dailySpecials

By simply adding a props_at parameter to your requests, you can selectively fetch parts of the page without incurring the cost of loading unneeded content. This is great for functionality like modals, tabs, etc.

The props_at param

The props_at param is a keypath to the content in your PropsTemplate. As a simplified example, imagine this page with no layouts:

path = param_to_dig_path(params[:props_at])
json.data(dig: path) do
  json.header do
    json.search do
      # Results is a leaf node
      json.results Post.search(params[:some_search_str])
    end
  end

  json.content do
    json.barChart do
       ...bar chart data
    end

    ...
  end

  ...
end

To fetch the json.search node, we would need to walk to data then header then search. Translating that to a url with a props_at param:

Digging is normally combined with using data-sg-remote or remote to update content in async fashion.

!!! info props_at can be used with data-sg-visit

Collections

There are two ways to query collections. Looking at the following example:

Index-based selection

You may use an index-based key to fetch an item in a list like so:

To enable this functionality, you are required to implement member_at(index) on the passed collection.

?> PropsTemplate includes a Array extension which delegates to at. If you've used the Superglue generators, it will be included in an initializer.

While traversing by index works fine, it can lead the wrong post being updated if your Redux state has changed by the time the request comes back.

Attribute-based selection

Attribute-based keys for collections look like this:

Notice that we're now referencing the collection member by some_id=1 instead of index. This will fetch the node from the backend and graft it correctly in Redux.

To enable this, you are required to implement member_by(attribute, value) on the passed collection AND use the option :key in json.array!. For example:

Partials

You can even query into partials.

!!! info When querying, Superglue will disable caching and deferment until the target node is reached.

With digging, many modern SPA functionality can be achieved by just a keypath and a few lines of code.

Last updated

Was this helpful?