On Saturday 14 February 2009, Christian Beier wrote:
> Ich glaube die größte Schwierigkeit wird es sein, die vier Felder auf
> Eingaben "zu überwachen" um zum richtigen Zeitpunkt die Validierung
> anzustoßen und auch die Eingaben an den Rails-Controller zu
> übertragen.

Bei jQuery bin ich da nicht auf der Höhe, bin aber sicher, dass es die 
nötigen Mittel gibt. Grundsätzlich musst du Client-seitig drei 
Teilprobleme lösen: (1) Erkennen, dass sich die relevanten Felder 
geändert haben. (2) Ajax-Request mit den serialisierten Feldern. (3) 
Anzeige des Validierungsergebnisses.

Dabei solltest du noch sicherstellen, dass nicht jeder Tastendruck einen 
Request an den Server auslöst. Das kannst du mit einem Timer erreichen, 
der bei jeder Änderung neu gestartet wird und daher erst dann auslöst, 
wenn es zwar eine Änderung gab, sich aber eine bestimmte Zeit nichts 
mehr geändert hat. Mit Prototype habe ich das in einem eigenen 
Validator mal mit der angehängten Klasse gemacht.

Michael


Event.UserActionObserver = Class.create();

Event.UserActionObserver.ignoredKeys = [
  Event.KEY_TAB,
  Event.KEY_RETURN,
  Event.KEY_ESC
];

Event.UserActionObserver.prototype = {
  initialize: function(container, callback, options) {
    this.options = Object.extend({
      latency: 0.4,
      events: ['keypress', 'change']
    }, options);

    this.container = $(container);
    this.callback = callback;
    this.latency = this.options.latency * 1000;
    this.timer = null;
    this.notifyCallback = this._notifyCallback.bind(this);
    this.onAction = this._onAction.bindAsEventListener(this);
    this.start();
  },

  start: function() {
    var events = this.options.events;
    for (var i = 0; i < events.length; i++) {
      Event.observe(this.container, events[i], this.onAction);
    }
  },

  stop: function() {
    var events = this.options.events;
    for (var i = 0; i < events.length; i++) {
      Event.stopObserving(this.container, events[i], this.onAction);
    }
  },

  _onAction: function(event) {
    if (Event.UserActionObserver.ignoredKeys.include(event.keyCode)) {
      return;
    }
    if (this.timer) {
      clearTimeout(this.timer);
    }
    this.timer = setTimeout(this.notifyCallback, this.latency);
  },

  _notifyCallback: function() {
    this.callback();
  }
};

-- 
Michael Schuerig
mailto:[email protected]
http://www.schuerig.de/michael/
_______________________________________________
rubyonrails-ug mailing list
[email protected]
http://mailman.headflash.com/listinfo/rubyonrails-ug

Antwort per Email an