2013-11-15 44 views
1

(人为)例如收集的网址深度> 1嵌套问题的REST资源URL:ExtJS4:在使用协会

VERB /leagues 
VERB /leagues/{leagueId}/teams 
VERB /leagues/{leagueId}/teams/{teamId}/players 

的目标是配置我的协会和代理来自动瞄准这些URL。

目前,我对每个联赛的典范,球员,在

(联盟)---的hasMany的方向的hasMany联想链 - >(团队)--- hasMany - >(Player)

与拥有模型的Id在相关模型中用作外键。 (即每个TeamleagueId相当于它的id拥有真实League,每个Player有一个TeamId相当于它的id拥有真实Team)在解决这个

一个尝试可以发现here。但是,它并不适合我。我最初的尝试重写代理的buildUrl方法:

buildUrl: function(request) { 
     var url = this.getUrl(request), 
      ownerId = request.operation.filters[0].value; 

     url = url.replace('{}', ownerId); 

     request.url = url; 
     return Ext.data.proxy.Rest.superclass.buildUrl 
      .apply(this, arguments); 
    }, 

这就为1(VERB /leagues/{leagueId}/teams)URL资源深度的作品完美。问题是,当我做这样的事情:

League.load(1, { 
    callback: function(league) { 
     league.teams().load({ 
      callback: function(teams) { 
       // all good so far 
       var someTeam = teams[0]; 
       someTeam.players().load({ 
        // problem here. someTeam.players() does not have a filter 
        // with leagueId as a value. Best you can do is 
        // GET/leagues/undefined/teams/42/players 
       }); 
      } 
     }); 
    } 
}); 

我需要做什么才能得到我需要建立链接的buildUrl方法的所有信息覆盖?我不想每次都手动添加一个筛选器 - 这种方式会使目标失败,我可能会每次都设置代理。

感谢您的帮助

回答

0

我现在的(工作),我想出了解决办法是修改内部资源的constructor和手动添加过滤器来生成的商店那里。例如:

App.models.Team

constructor: function() { 
    this.callParent(arguments); 
    this.players().filters.add(new Ext.util.Filter({ 
     property: 'leagueId', 
     value: this.raw.leagueId 
    })); 
    return this; 
}, 

和方式,所有的过滤器属性:值对是通过request.operation.filtersbuildUrl方法可用。

我现在接受此答案(因为它的工作原理),但如果建议更好的答案,它将接受另一个答案。