Search code examples
dojojs-amd

Existing widgets not available in a widget template in some (strange) cases


This took me a while. A long while. I battled two problems at once (circular dependencies, fixed with refactoring, and this problem). To get this problem into a JSFiddle required a LOT of work... but I think it was worth it. So:

http://jsfiddle.net/EVbTL/3/

I define three widgets:

  • r.AppMainScreen -- This is the main app's widget. Easy: just a bunch of tabs, and a button which contains a simple button, which goes:

    // SUbmit form
    this.form.onSubmit = function(e){
        e.preventDefault();
        console.log("HERE");
        dialog = new r.RetypePasswordDialog();
        dialog.show();           
        return false;
    }
    

Pretty uninteresting.

  • r.RetypePasswordDialog() -- A templated widget which represents a dialog box. The only interesting thing about it is:

    < input name="password" id="${id}_password" data-dojo-attach-point="password" data-dojo-type="app.ValidationPassword" />

It's a simple custom widget, defined in this very file, which does validation. NOTE: I know there is no point in having a subclass here for this little work. Please keep in mind that this is an example.

  • r.ValidationPassword()

An augmented ValidationTextBox with some extra validation.

If you click on the button, you get:

Uncaught Error: Could not load class 'app.ValidationPassword 

...?!? app.ValidationPassword has definitely been defined. It ought to be available there. At the beginning, I thought it was because of aa circular dependency (it was very fun, yesterday: I had to learn about AMD circular dependencies WHILE trying to figure out this problem...)

If you uncomment this line, executed within the script:

TEST = new r.RetypePasswordDialog();

The whole thing works. It's a meaningless instance, and I cannot figure out why on earth this would or should make a difference.

Explanations most welcome... I couldn't find any!

Thank you,

Merc.


Solution

  • app = new r.AppMainScreen( {});
    

    You redefine the global app variable here, but are trying to use it elsewhere as the base object for your type system. Use var to scope variables to the function.