我很好奇其他人如何使用底层关系数据库创建他们的AngularJS视图模型?我和我的团队在决定是否应该在服务器端或客户端进行对象连接时遇到问题。在服务器或客户端上创建AngularJS View-Model?
例如,我们在服务器上有几个型号,如Author
,Book
和BookComment
。在第一个示例中,只有一个端点可以像/api/author/:id
那样获得Author
,并且它在服务器上“打包”整个视图模型。第二个示例中,每个对象都有自己的RESTful API端点,如/api/authors/:id
,api/books/:id
和/api/bookcomments/:id
。
一个Author
可以有一个或多个Book
对象和一个Book
可以有一个或多个BookComment
对象。
现在让我们来比较2种情况:
服务器端加入
我们让服务器加入基于关外键的对象,并与像
作者物体结束
{
'id':1,
'firstName':'John',
'lastName':'Steinbeck',
'books':[{
'id':123,
'title': 'Grapes of Wrath',
'author':1,
'comments':[{
'id':555,
'content':'This is a great book!',
'book':123
}]
}]
}
这将得到所有的neede d数据和对象以正确呈现视图。然后,问题就变成了管理原子级别的评论和书籍,所以如果用户只编辑评论,我们不想保存整个对象,而只需更新BookComment
对象。这需要拔出物体并用角状物$resource
或类似的东西来引导它们。
客户端加入
我们要求的车型单独,然后加入他们的客户端上:
作者
{
'id':1,
'firstName':'John',
'lastName':'Steinbeck',
'books':[]
}
书
{
'id':123,
'title': 'Grapes of Wrath',
'author':1,
'comments':[]
}
BookComment
{
'id':555,
'content':'This is a great book!',
'book':123
}
如果我拉下对象使用RESTful接口列表,然后我可以使用的东西加入他们喜欢
//Get the author
var author = Author.get();
//Join the books that were authored by this author
author.books = filterFilter(books, {author:author.id});
// Iterate each book and filter the comments by book ID
angular.forEach(books, function(book){
book.comments = filterFilter(comments, {book:book.id});
});
这些都具有自己的优点和缺点。第一个原因很难自动管理这些对象,这迫使您POST大型对象并使后端处理更新SQL数据库。第二个向客户端添加更多工作,因为您需要拉下大型数据集,然后过滤/将它们连接到其他模型上。
是否还有另一个选项,我还没有遇到或者是这两种方式之一被认为是最佳实践?