2

我有一个名为的主干模型,User它有一个urlRoot. /api/users因此,如果我创建一个 ID 为 5 的新模型,则 url 将为/api/users/5.

我还实现了另一个端点,即获取单个用户的 Twitter 朋友。终点是/api/users/:id/twitter-friends

我是否需要使用 this 创建一个新集合url并手动设置id,或者我可以以某种方式在我的模型上创建一个方法,该方法将发出此请求并返回一个新集合实例(该用户的 Twitter 朋友的)。例如:

var user = new User({ id: 5 })
user.findTwitterFriends() // returns collection of users

或者,为此类数据创建一个唯一集合:

var user = new User({ id: 5 })

var users = new Users()
users.url = user.url() + '/find-friends/twitter' // /api/users/5/find-friends/twitter
users.fetch()

以这种方式处理 URL 的最佳做法是什么?有没有更好的办法?我对其他用途也有类似的需求,例如我的 API 端点可以通过用户名在/api/users/username/:username. 为此,我必须手动设置 urlRoot:

var user = new User({ username: username })
user.urlRoot = user.urlRoot + '/username/' + username
user.fetch()

也许我应该以不同的方式设计我的 URL?我愿意接受所有建议。

4

1 回答 1

0

根据我的经验,它是覆盖 Backbone.sync 的最佳方式,即使在模型中也是如此。

查看主干模型.fetch!你可以看到它需要 [options] 。因此,从我的脑海中,我会说这将是一种更清洁的方式。您甚至可以只覆盖与您的 get 用户的 Backbone 同步,并让 Backbone 处理 getUsers。

/*
this method is redundant.I added it to show you can add options as you go. 
*/

getUsers : function() {
    this.fetch({
        action = 'getUsers';
    });
}



getUser : function(username) {
    this.fetch({
        action = 'getSingleUser'.
        username = username;
    });
},

sync : function(method, model, options) {

        if(method === 'read'){
            if(options.action === 'getSingleUser') {
                                this.url = '/username/' + options.username;
                            }
            else this.url = '/find-friends/twitter';
            ret = Backbone.sync.apply(this, arguments);
            return ret;
        }
        else{
            return Backbone.sync.call(this, method, this, options);
        }
}
于 2014-04-09T08:33:23.273 回答