2

不是一个这个问题的人......答案基本上是说“你做错了 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

4

2 回答 2

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

于 2014-12-10T15:25:53.597 回答
1

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

此外,从 v2.1 开始,不推荐将响应直接传递给,.models优先转换它.parseModels

    var 问题 = can.Model.extend({
      findAll: '获取问题',
      findOne: 'GET 问题/{id}',

      查找相关:函数(问题){
        返回 can.ajax({
          类型:'GET',
          url: '问题/'+issue.id+'/相关'
        }).then(函数(响应){
          返回 this.models(this.parseModels(response));
        }.bind(this));
      }

    },{
      查找相关:函数(){
        返回 this.constructor.findRelated(this);
      }
    });

    // 使用示例
    // 1. Issue.findRelated({id: 1});
    // 2. new Issue({id: 1}).findRelated();

jsfiddle

于 2015-04-26T08:13:46.153 回答