骨干牵线木偶相关模型

时间:2014-07-23 14:47:04

标签: javascript backbone.js marionette backbone-relational backbone-model

我正在尝试列出与相关用户的一些帖子。每个帖子都有一个标题,一个像这样的userId:

[{
   "userId": 1,
   "id": 1,
   "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
   "text": "quia et suscipit\nsuscipit recusandae consequuntur expedita et cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet architecto"

    }]

如何将我的帖子模型与用户模型联系起来?它的工作方式就像我在下面尝试过的那样,但它很快又脏。我需要使用骨干关系吗?我只是不知道在我的应用程序中,骨干关系是否仅仅是一对二关系的过度杀伤。

var fetchingPosts = BackboneApplication.request("post:entities");
var postsListLayout = new List.Layout();

$.when(fetchingPosts).done(function(posts){
        $.each(posts.models, function(i, post){
            var username  = BackboneApplication.request("user:entity", post.get("userId"));
            $.when(username).done(function(user){
                post.set("name",user.get("name"));
            });
        });
     var contactsListView = new List.Posts({
      collection: posts
});

编辑由于我的帖子模型看起来像这样的问题:

Entities.Post = Backbone.Model.extend({
    url : "url_to_rest_api",
    idAttribute : 'id'
});

编辑2:以下解析函数是否可能因为我无法更改其余的api。

parse: function(response) {
    user  = BackboneApplication.request("user:entity", response.userId)
    this.user = new User(user);
    return response'
}

1 个答案:

答案 0 :(得分:1)

一种选择是让您的帖子服务返回完全加载" Post"模型看起来像:

[{
   //not just an id anymore
   "user": {"id":1, "username":"Fred", "email":"bob@bob.com"},
   "id": 1,
   "title": "sunt aut facere repellat provident occaecati excepturi optio reprehenderit",
   "text": "quia et suscipit\nsuscipit recusandae consequuntur expedita et     cum\nreprehenderit molestiae ut ut quas totam\nnostrum rerum est autem sunt rem eveniet   architecto"

}]

然后在Post模型的解析方法中,您可以执行以下操作:

parse: function(response) {
    //convert raw user json to backbone model
    response.user = new User(response.user);
    return response'
}

这避免了关系依赖关系,但要求您的rest端点加载包含所有post数据的用户数据。你可以让你的端点是特定的,但你的服务层是通用的,所以post和user的概念仍然松散耦合

//pseudo
def getPost(id) {
   def post = postService.getPost(id);
   post.user = userService.getUser(post.userid)
   render post as json
}