The .on() method creates a realtime subscription that triggers a callback whenever data changes. Unlike .once(), it continues listening indefinitely until explicitly unsubscribed.
// Listen to a specific propertygun.get('user/alice').get('name').on(function(name){ console.log('Name changed to:', name)})// Listen to nested objectsgun.get('user/alice').get('settings').on(function(settings){ console.log('Settings updated:', settings)})
// Only fire on changes, skip initial valuegun.get('counter').on(function(count){ console.log('Counter changed:', count)}, true) // or { change: true }// First read won't trigger callbackgun.get('counter').once(function(count){ console.log('Initial value:', count) // This fires})
// Store reference to unsubscribe latervar ref = gun.get('messages').on(function(msg){ console.log('New message:', msg)})// Later, stop listeningref.off()// Or use the event parametergun.get('messages').on(function(msg, key, message, event){ console.log('Message:', msg) // Unsubscribe after first message event.off()})
// Two-way sync with form inputvar input = document.getElementById('username')// Listen for remote changesgun.get('user/alice').get('name').on(function(name){ if(input.value !== name){ input.value = name // Update input from remote }})// Send local changesinput.addEventListener('input', function(){ gun.get('user/alice').get('name').put(input.value)})