Thanks for your help, this is now working. I have an example more or less 
complete here:

git clone g...@github.com:gonvaled/pyjs.git
cd pyjs/examples
python jquery-select2 --download

There is still one important issue open: the self.change method is bound to 
wnd().change. See here:
https://github.com/gonvaled/pyjs/blob/master/examples/jquery-select2/Select2TaggingComponent.py#L57

If there are multiple Select2TaggingComponent defined, they will overwrite 
this binding, so that only the last one is really active.
You can see the problem in the example application, which has two 
components defined.

The solution would be to do somehting like this:

    def bind_pyjs_change(self):
        # This is supposed to bind the change event to the change pyjs 
function
        # Since we are binding a global function to the self.change method, 
we want
        #   that global function to be unique (or at least to have the myid 
suffix)
        global_unique_change = "change_%s" % (self.myid)
        wnd().global_unique_change = self.change
        # Now bind the change event to the wnd().global_unique_change 
function, which is actually self.change
        myjs = 'parent.jQuery("#%s").bind("change", function() { 
parent.%s() });' % (self.myid, global_unique_change)
        log.info("Now calling JS: %s", myjs)
        JS(""" eval(@{{myjs}}) """)

The problem is that wnd().global_unique_change = self.change generates:

$wnd['__is_instance__'] && typeof $wnd['__setattr__'] == 'function' ? $wnd[
'__setattr__']('global_unique_change', $p['getattr'](self, 'change')) : $p[
'setattr']($wnd, 'global_unique_change', $p['getattr'](self, 'change'));

As you see, 'global_unique_change' is taken as literal, but should be a 
variable in this particular case. It should generate:

$wnd['__is_instance__'] && typeof $wnd['__setattr__'] == 'function' ? $wnd[
'__setattr__'](global_unique_change, $p['getattr'](self, 'change')) : $p[
'setattr']($wnd, global_unique_change, $p['getattr'](self, 'change'));

I have modified that manually in the output javascript, and it works. Now 
the question is how to tell pyjscompile to do the "right thing". I realize 
this is very special case, but how can it be covered?

Thanks,
Daniel


Reply via email to