2

I created a simple MVC application with canjs for an users list, by using can.Model.List. Since my request could take more than 5 second, I would add in the view a little preload message/image during the loading.

i.e. I would something like this (I'm using mustache)

var users = new Users.List({});
element.html(can.view('myView', users);

with this template:

{{#if loading}}
   <p>Loading, please wait...</p>
{{else}}
   <ul>
      {{#each this}}
         <li>User {{ name }} {{ surname }}</li>
      {{/each}}
   </ul>
{{/if}}
</ul>

I can solve by having a new observable variable, but I think there's a better way to direct manage this deferred data inside the view.

Any ideas?

ramblinjan
  • 6,578
  • 3
  • 30
  • 38

1 Answers1

3

You can use the list promise plugin to show a loading indicator while a Deferred is being resolved:

var users = new Users.List();
users.replace(Users.findAll());
element.html(can.view('myView', { users: users });

This will even allow you to show loading error messages:

{{#if users.isPending}}
   <p>Loading, please wait...</p>
{{else}}
  {{#if users.isResolved}}
   <ul>
      {{#each users}}
         <li>User {{ name }} {{ surname }}</li>
      {{/each}}
   </ul>
   {{else}}
   There was an error loading the user list.
   {{/if}}
{{/if}}
</ul>
Daff
  • 43,734
  • 9
  • 106
  • 120