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

时间:2014-10-10 02:22:55

标签: javascript canjs canjs-model

我是not firstask这个...答案主要是说“你做错了你做错了。”很公平,但开发充满了权衡,我经常发现自己 无法重写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

2 个答案:

答案 0 :(得分:2)

如果我正确理解了这个问题,您希望从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

答案 1 :(得分:1)

与接受的答案类似,另一个选项是返回can.ajax而不是创建新的延迟。它的冗长程度稍微低一些。

此外,从v2.1开始,将响应直接传递给.modelsdeprecated,并首先使用.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