dojox.data.KeyValueStore

since:V1.1

This is a dojo.data store implementation. The KeyValueStore is a store that takes content in a format similar to those used by property files, such as Java, and many other languages were there are unique keys mapping to some value for display. Think of it as an interface for reading property style files in dojo through the dojo.data interface.

Input Format

It can take in either a JavaScript array, JSON string, or URL as the data source. Data is expected to be in the following format:

[
  { "key1": "value1" },
  { "key2": "value2" },
  ...
]

Each 'item' retrieved from this store from this store is a JS object representing a key-value pair. If an item in the above array has more than one key/value pair, only the first will be used/accessed.

Such a construct can be formed from a JS object of the form { k1:v1, k2:v2, ... } with code like

var myVar={"key1": "value1" , "key2": "value2", ... };
var myData=[];
for(var p in myVar){
  var t={};
  t[p]=myVar[p];
  myData.push(t);
}

Constructor Parameters

The constructor for the store can take three different parameters as a way to load the data; a URL to a JSON encoded file, a reference to a JavaScript object in key/value pair format, and a JSON encoded string. The parameters are documented below:

Parameter Description Type
url The URL from which to xhrGet load a JSON encoded file of the data. String
data A JSON encoded string of the data. String
dataVar A JavaScript Array object of the items. JavaScript Array
urlPreventCache Flag denoting whether or not browser caching should be avoided. Defaults to false. New to Dojo 1.4 boolean

Item Attributes

Items from the KeyValueStore have two well-defined attribute names 'key' and 'value', as well as the dynamic value of store.getValue(item, "key"). See the table below for further details.

Attribute Description Type
key The value of this attribute is the named key used in the key/value pair. String
value The value of this attribute is the value assigned to be the key of the key/value pair. String
getValue(item, "key") The named key of the key/value pair.  

Examples

List out all the attributes and values of a key/value data set

dojo.require("dojox.data.KeyValueStore");
dojo.require("dijit.form.Button");

var storeData = [
    { 'key1' : 'value1' },
    { 'key2' : 'value2' },
    { 'key3' : 'value3' },
    { 'key4' : 'value4' },
    { 'key5' : 'value5' }
  ];

  // This function performs some basic dojo initialization. In this case it connects the button
  // onClick to a function which invokes the fetch(). The fetch function queries for all items
  // and provides callbacks to use for completion of data retrieval or reporting of errors.
  function init(){
     // Function to perform a fetch on the datastore when a button is clicked
     function getAllItems(){

       // Callback to perform an action when the data items are starting to be returned:
       function clearList(size, request){
         var list = dojo.byId("list");
         if(list){
           while(list.firstChild){
             list.removeChild(list.firstChild);
           }
         }
       }

       // Callback for processing a returned list of items.
       function gotItems(items, request){
         var list = dojo.byId("list");
         if(list){
           var i;
           for(i = 0; i < items.length; i++){
             var item = items[i];
             var field = document.createElement("b");
             field.appendChild(document.createTextNode("Key: "));
             list.appendChild(field);
             list.appendChild(document.createTextNode(kvStore.getValue(item, "key")));
             list.appendChild(document.createTextNode("  "));
             field = document.createElement("b");
             field.appendChild(document.createTextNode("Value: "));
             list.appendChild(field);
             list.appendChild(document.createTextNode(kvStore.getValue(item, "value")));
             list.appendChild(document.createTextNode("  "));
             field = document.createElement("b");
             field.appendChild(document.createTextNode("Value by named key (" + kvStore.getValue(item, "key") + "): "));
             list.appendChild(field);
             list.appendChild(document.createTextNode(kvStore.getValue(item, kvStore.getValue(item, "key"))));
             list.appendChild(document.createElement("br"));
           }
         }
       }

       // Callback for if the lookup fails.
       function fetchFailed(error, request){
          alert("lookup failed.");
       }

       // Fetch the data in a sorted order.
       kvStore.fetch({onBegin: clearList, onComplete: gotItems, onError: fetchFailed});
     }
     // Link the click event of the button to driving the fetch.
     dojo.connect(button, "onClick", getAllItems);
  }
  // Set the init function to run when dojo loading and page parsing has completed.
  dojo.ready(init);
<div data-dojo-type="dojox.data.KeyValueStore" data-dojo-props="data:storeData" data-dojo-id="kvStore"></div>
<div data-dojo-type="dijit.form.Button" data-dojo-id="button">Show me the key/value info!</div>
<br>
<br>
<b>List of item information:</b>
<br>
<span id="list">
</span>

Connecting key/value store to dojox.grid.DataGrid

dojo.require("dojox.data.KeyValueStore");
dojo.require("dojox.data.HtmlStore");
dojo.require("dojox.grid.DataGrid");

var storeData2 = [
  { 'key1' : 'value1' },
  { 'key2' : 'value2' },
  { 'key3' : 'value3' },
  { 'key4' : 'value4' },
  { 'key5' : 'value5' }
];

var layoutKeyValue = [
  [
    { field: "key", name: "KEY", width: 10 },
    { field: "value", name: "VALUE", width: 'auto' }
  ]
];
<b>dojox.grid.DataGrid connected to the KeyValueStore:</b><br>
<div data-dojo-type="dojox.data.KeyValueStore" data-dojo-props="data:storeData2" data-dojo-id="kvStore2"></div>
<div style="width: 400px; height: 200px;">
  <div id="grid"
    data-dojo-type="dojox.grid.DataGrid"
    data-dojo-props="store:kvStore2,
    structure:'layoutKeyValue',
    query:{},
    rowsPerPage:40">
  </div>
</div>
@import "{{baseUrl}}dojox/grid/resources/Grid.css";
@import "{{baseUrl}}dojox/grid/resources/nihiloGrid.css";

.dojoxGrid table {
  margin: 0;
}

Connecting key/value store to dijit.form.ComboBox

dojo.require("dojox.data.KeyValueStore");
dojo.require("dojox.data.HtmlStore");
dojo.require("dijit.form.ComboBox");

var storeData3 = [
  { 'key1' : 'value1' },
  { 'key2' : 'value2' },
  { 'key3' : 'value3' },
  { 'key4' : 'value4' },
  { 'key5' : 'value5' }
];
<b>dijit.form.ComboBox connected to the KeyValueStore:</b><br>
<div data-dojo-type="dojox.data.KeyValueStore" data-dojo-props="data:storeData3" data-dojo-id="kvStore3"></div>
<div data-dojo-type="dijit.form.ComboBox" data-dojo-props="store:kvStore3, searchAttr:'key'"></div>