Marionette js itemview not defined: then on browser refresh it is defined and all works well - race condition?

Posted by Robert on Stack Overflow See other posts from Stack Overflow or by Robert
Published on 2013-10-25T03:49:10Z Indexed on 2013/10/25 3:53 UTC
Read the original article Hit count: 207

Yeah it's just the initial browser load or two after a cache clear. Subsequent refreshes clear the problem up.

I'm thinking the item views just aren't fully constructed in time to be used in the collection views on the first load. But then they are on a refresh? Don't know.

There must be something about the code sequence or loading or the load time itself. Not sure. I'm loading via require.js.

Have two collections - users and messages. Each renders in its own list view. Each works, just not the first time or two the browser loads.

The first time you load after clearing browser cache the console reports, for instance:

"Uncaught ReferenceError: MessageItemView is not defined"

A simple browser refresh clears it up. Same goes for the user collection. It's collection view says it doesn't know anything about its item view. But a simple browser refresh and all is well.

My views (item and collection) are in separate files. Is that the problem? For instance, here is my message collection view in its own file:

messagelistview.js

    var MessageListView = Marionette.CollectionView.extend({
        itemView: MessageItemView,
        el: $("#messages")
    });

And the message item view is in a separate file:

messageview.js

    var MessageItemView = Marionette.ItemView.extend({
        tagName: "div",    
        template: Handlebars.compile(
                '<div>{{fromUserName}}:</div>' +
              '<div>{{message}}</div>' +
        )
    });

Then in my main module file, which references each of those files, the collection view is constructed and displayed:

main.js

    //Define a model
    MessageModel = Backbone.Model.extend();

    //Make an instance of MessageItemView - code in separate file, messagelistview.js
    MessageView = new MessageItemView();


    //Define a message collection 
    var MessageCollection = Backbone.Collection.extend({
        model: MessageModel    
    });

    //Make an instance of MessageCollection
    var collMessages = new MessageCollection(); 


    //Make an instance of a MessageListView -  code in separate file, messagelistview.js
    var messageListView = new MessageListView({
        collection: collMessages
    });

    App.messageListRegion.show(messageListView);

Do I just have things sequenced wrong? I'm thinking it's some kind of race condition only because over 3G to an iPad the item views are always undefined. They never seem to get constructed in time. PC on a hard wired connection does see success after a browser refresh or two.

© Stack Overflow or respective owner

Related posts about collections

Related posts about requirejs