dyoo / whalesong

Whalesong: Racket to JavaScript compiler
http://hashcollision.org/whalesong
250 stars 30 forks source link

select forms always return the first value regardless of form content #91

Closed dyoo closed 12 years ago

dyoo commented 12 years ago

The following program shows that something funny is happening. Reported by jvjulien:

#lang planet dyoo/whalesong
(require (planet dyoo/whalesong/web-world))

(define (draw w v)
  (define v2 (view-focus v "fill-me-in"))
  (update-view-text v2 w))

(define view (xexp->dom '(div
                          (h1 "test")
                          (select (@ (id "my-select"))
                                  (option (@ (value "red")) "Red")
                                  (option (@ (value "green")) "Green")
                                  (option (@ (value "blue")) "Blue"))
                          (p
                            "I see: "
                            (span (@ (id "fill-me-in")))))))

(define (when-select-changed w v)
  (printf "I see: ~s\n" (view-form-value (view-focus v "my-select")))
  (view-form-value (view-focus v "my-select")))

(define bound-view (view-bind-many view ["my-select" "change" when-select-changed]))

(big-bang "nothing yet"
          (initial-view bound-view)
          (to-draw draw))
dyoo commented 12 years ago

Bug isolated. For some reason, JQuery clone() does not properly clone the select dom node and does not properly save its value. This looks like a bug in JQuery! ... Actually, this is controlled by the DOM model. The DOM model itself does not properly preserve select's state when doing a cloneNode. Nuts. Trying for a workaround...

dyoo commented 12 years ago

If I change domToArrayTreeCursor to do additional hacking on select blocks, we might be able to work around this:

       var cloned = $(dom).clone(true);
        var sourceSelects = $(dom).find("select");
        var destSelects = cloned.find("select");
        var i;
        for (i = 0; i < sourceSelects.length; ++i) {
            $(destSelects[i]).val($(sourceSelects[i]).val());
        }
        return TreeCursor.adaptTreeCursor(domNodeToArrayTree(cloned.get(0)),
                                          domOpenF,
                                          domCloseF,
                                          domAtomicF);
dyoo commented 12 years ago

will be fixed by 8397c4becebb7a74f6baa8d0932595491fd44934