Canjs-扩展can.使用其他方法建模

Canjs - Extending can.Model with additional Methods

本文关键字:其他 方法 建模 扩展 can Canjs-      更新时间:2023-09-26

我不是第一个问这个问题的人。。。答案基本上是说"好吧,你做REST错了。"这很公平,但开发充满了权衡,我经常发现自己处于重写API的位置。

转到手头的问题,向模型中添加某个资源的方法最优雅的方法是什么?

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

如果我正确理解了这个问题,那么您需要从findRelated获得Issue.List

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

另一个选项类似于已接受的答案,是返回can.ajax,而不是创建一个新的延迟。它不那么冗长了。

此外,从v2.1开始,不赞成将响应直接传递给.models,最好先用.parseModels进行转换。

var Issue=可以。型号扩展({findAll:"获取问题",findOne:"获取问题/{id}",findRelated:函数(问题){返回can.ajax({类型:"GET",url:'Issue/'+Issue.id+'/Related'}).然后(函数(响应){返回this.models(this.parseModels(response));}.bind(this));}}{findRelated:函数(){返回this.constructor.findRelated(this);}});//用法示例//1。Issue.findRelated({id:1});//2。new Issue({id:1}).findRelated();

jsfiddle