Search code examples
javascriptyuiyui3

YUI3 Datasource to return custom Object


How can I get the YUI3 sendRequest applied to a Datasource to return predefined objects, instead of plain ones?

For example, I have this Base class with its methods:

function Student(id, name){
   this.id = id;
   this.name = name;
}
Context.prototype.setId   = function(id){ this.id = id; };
Context.prototype.setName = function(name){ this.name = name; };
Context.prototype.getId   = function(){ return this.id; };
Context.prototype.getName = function(){ return this.name; };

And I have this code that retrieves data from an API, normalizes it and returns data as objects:

var studApiDataSource = new Y.DataSource.Get({source: API_URL});

studApiDataSource.plug(Y.Plugin.DataSourceJSONSchema, {
  schema: {
    resultListLocator: "response.student",
    resultFields: ["id","name"]
  }
});

var myCallback = function(e) {
  Y.Array.each(e.response.results, function(stud){
    Y.log(stud.id+' '+stud.name);
  }
}

studApiDataSource.sendRequest({
  request: "?cmd=getStudents",
  callback: {
    success: myCallback,
    failure: function (e) { }
  }
});

The array of objects retrieved by studApiDataSource.sendRequest() and passed to myCallback are normal objects, with id and name properties. However, I want these to be Student objects, with their member functions too (getId, getName etc)


Solution

  • I'm not sure I fully understand, but you could do something like the following.

    var studentJSON = "{\"id\": 17, \"name\":\"my name is\"}";
    function Student(obj){
      this.name = obj.name;
      this.id = obj.id;
    }
    Student.prototype.setId   = function(id){ this.id = id; };
    Student.prototype.setName = function(name){ this.name = name; };
    Student.prototype.getId   = function(){ return this.id; };
    Student.prototype.getName = function(){ return this.name; };
    
    YUI().use('json-parse', 'json-stringify', function (Y) {
    
        try {
    
            var stud = new Student(Y.JSON.parse(studentJSON));
            alert(stud.getId());
        }
        catch (e) {
            alert(e);
        }
    
    });