2014-10-10 2 views
2

Я notfirst человек до ask это ... ответы в основном говорят: «Ну, вы делаете REST неправильно». Достаточно справедливо, но разработка заполнена компромиссами, и я часто оказываюсь не, чтобы переписать API.Canjs - Расширение can.Model с дополнительными методами

Переходя к проблеме под рукой, какой самый элегантный способ добавить метод для некоторого ресурса к модели?

var Issue = can.Model.extend({ 
    findAll: 'GET Issues', 
    findOne: 'GET Issues/{id}', 
    findRelated: can.Model.makeFindAll(function(params) { 
    return can.ajax({ 
     type: 'GET', 
     url: 'Issues/'+params.id+'/' 
    }); 
    }) 
},{}); 

jsfiddle

ответ

2

Если я правильно понял вопрос правильно, вы хотите получить Issue.List от findRelated.

var Issue = can.Model.extend({ 
    findAll: 'GET Issues', 
    findOne: 'GET Issues/{id}', 

    findRelated: function(params) { 
    var deferred = new can.Deferred(); 

    can.ajax({ 
     type: 'GET', 
     url: 'Issue/'+params.id+'/Related' 
    }).then(function(response) { 
     // success 
     deferred.resolve(Issue.models(response || [])); 
    }, function(xhr, textStatus, err) { 
     // failure 
     deferred.reject(err); 
    }); 

    return deferred; 
    } 

},{}); 

jsfiddle

1

Другой вариант, аналогичный принятому ответу, является возвращение can.ajax вместо создания нового отложила. Это немного меньше подробностей.

Также, начиная с версии 2.1, передача ответа непосредственно на .models равна deprecated и его преобразование сначала с использованием .parseModels.

 

    var Issue = can.Model.extend({ 
     findAll: 'GET Issues', 
     findOne: 'GET Issues/{id}', 

     findRelated: function(issue) { 
     return can.ajax({ 
      type: 'GET', 
      url: 'Issue/'+issue.id+'/Related' 
     }).then(function(response) { 
      return this.models(this.parseModels(response)); 
     }.bind(this)); 
     } 

    },{ 
     findRelated: function() { 
     return this.constructor.findRelated(this); 
     } 
    }); 

    // usage examples 
    // 1. Issue.findRelated({id: 1}); 
    // 2. new Issue({id: 1}).findRelated(); 

jsfiddle

Смежные вопросы