骨干模型和URL异常

时间:2013-05-09 11:32:44

标签: javascript api rest backbone.js

我有一个名为User的Backbone模型,其urlRoot/api/users。因此,如果我创建ID为5的新模型,则网址将为/api/users/5

我还实现了另一个端点,即获取个人用户的Twitter好友。此端点为/api/users/:id/twitter-friends

我是否需要使用此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()

也许我应该以不同的方式设计我的网址?我对所有建议持开放态度。

1 个答案:

答案 0 :(得分:0)

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

Backbone Model.fetch!你可以看到它需要[选项]。 因此,从我的头脑中,我会说这将是一种更清洁的方式。您甚至可以仅覆盖与获取用户的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);
        }
}