2010-11-25 2 views
4

J'ai une réplication fonctionnant dans CouchDB et je veux mettre à jour mon interface utilisateur lorsque les changements sont poussés vers la base de données cible. J'ai lu à propos de l'API de la base de données _changes et j'ai trouvé la fonction couch.app.db.changes() dans jquery.couch.js. Cependant, je ne sais pas comment utiliser cette fonction. Je suppose que j'ai besoin de configurer l'écoute, mais ma connaissance de Javascript n'est pas encore ce qu'elle doit être.CouchDB _changes notifications - jquery.couch.js couch.app.db.changes() utilisation

Malheureusement, les documents de http://www.couch.io/page/library-jquery-couch-js-database ne répertorient même pas la fonction changes().

Quelqu'un peut-il m'aider ici et aussi me faire savoir à quoi servent les options param.

Voici le code de la fonction en question:

changes: function(since, options) { 
     options = options || {}; 
     // set up the promise object within a closure for this handler 
     var timeout = 100, db = this, active = true, 
     listeners = [], 
     promise = { 
     onChange : function(fun) { 
      listeners.push(fun); 
     }, 
     stop : function() { 
      active = false; 
     } 
     }; 
     // call each listener when there is a change 
     function triggerListeners(resp) { 
     $.each(listeners, function() { 
      this(resp); 
     }); 
     }; 
     // when there is a change, call any listeners, then check for another change 
     options.success = function(resp) { 
     timeout = 100; 
     if (active) { 
      since = resp.last_seq; 
      triggerListeners(resp); 
      getChangesSince(); 
     }; 
     }; 
     options.error = function() { 
     if (active) { 
      setTimeout(getChangesSince, timeout); 
      timeout = timeout * 2; 
     } 
     }; 
     // actually make the changes request 
     function getChangesSince() { 
     var opts = $.extend({heartbeat : 10 * 1000}, options, { 
      feed : "longpoll", 
      since : since 
     }); 
     ajax(
      {url: db.uri + "_changes"+encodeOptions(opts)}, 
      options, 
      "Error connecting to "+db.uri+"/_changes." 
     ); 
     } 
     // start the first request 
     if (since) { 
     getChangesSince(); 
     } else { 
     db.info({ 
      success : function(info) { 
      since = info.update_seq; 
      getChangesSince(); 
      } 
     }); 
     } 
     return promise; 
    }, 

Répondre

3

Vous pouvez également utiliser l'alimentation des modifications longpoll. Voici un exemple:

function bind_db_changes(database, callback) { 
     $.getJSON("/" + database, function(db) { 
      $.getJSON("/"+ database + 
         "/_changes?since="+ db.update_seq +"&heartbeat=10000&feed=longpoll", 
      function(changes) { 
       if($.isFunction(callback)){ 
        callback.call(this, changes); 
        bind_db_changes(database, callback); 
       } 
      }); 
     }); 
    }; 

    bind_db_changes("test", function(changes){ 
     $('ul').append("<li>"+ changes.last_seq +"</li>"); 
    }); 
+0

Merci koleto, cela a fonctionné et avec d'autres travaux que j'ai faits, j'ai été en mesure de travailler sur la façon d'utiliser la fonction couch.app.db.changes(). Désolé pour la réponse tardive mais je n'étais pas au courant qu'il y avait une autre réponse affichée. – nevf

0

ce que sur l'utilisation des ajax-feateures de jquery?

function get_changes() { 
      $.getJSON("/path/to/_changes", function(changes) { 
       $.each(changes, function() { 
        $("<li>").html(this.text).prependTo(mychanges_div); 
       }); 
       get_changes(); 
      }); 
} 
setTimeout(get_changes, 1000); 
+0

Merci, je pourrais essayer ceci, cependant j'essayais simplement d'utiliser le code déjà fourni avec CouchApps. Oh pour de la documentation ou des commentaires de code à l'ancienne. – nevf

0

Je fais le travail avec JS promesses de code qui lui a permis mt de comprendre le code CounchDB je posté ci-dessus. Voici un exemple:

var promise_changes = app.db.changes(); 
// Add our deferred callback function. We can add as many of these as we want. 
promise_changes.onChange(db_changes); 

// called whenever this db changes. 
function db_changes(resp) { 
    console.log("db_changes: ", resp); 
} 

Google Chrome passe dans un état occupé avec une longue interrogation, que j'espère qu'ils résoudront un jour.