canjscanjs-model

CanJS how to refresh a model


I have a model which represents a list of jobs which are run on the server

I want to poll the server for updates on a timer to show changes to the state of the jobs.

How do I do this?

My Control looks like this

var control = Control({
        defaults: {
            view: 'app/views/job-index.ejs'
        }
    }, {
        init: function () {
            this.element
                .empty()
                .append(can.view(this.options.view, this.options));

            var options = this.options;
            window.setInterval(function() {
                options.result.refresh();
            }, 1000);
        },
    });

my model, so far looks like this

var model = can.Model({
        findOne: 'GET /api/jobs'
    }, {
        refresh: function() {
            // what goes here?
        }
    });

Solution

  • One observation first:

    If you are getting a collection of jobs you should probably want to use findAll instead of findOne:

    findAll: 'GET /api/jobs',
    findOne: 'GET /api/jobs/{id}'
    

    I understand that result is a single record. So you can do something like:

    var Model = can.Model({
        findAll: 'GET /api/jobs',
        findOne: 'GET /api/jobs/{id}'
        }, {
            refresh: function () {
                var id = this.attr('id');
                var self = this;
    
                Model.findOne({id: id}, function (model) {
                    self.attr(model.attr());
                });
        }
    });
    

    Also, by convention you should name your model class Model not model.

    Here is a fiddle http://jsbin.com/xarodoqo/4/edit