我使用nodejs并表达我的js服务器。
我需要一种方法来获取集合中的模型数量并将其发送给Backbone。
快递方面相当直接:
db.books.count(function (err, booksNr) {
if (err) return;
console.log(booksNr)
res.json(booksNr);
});
但我如何将其发送到骨干网?
我的第一个想法是将 booksNr 带到一个集合中,但我不能让它发挥作用。
以下是我从Backbone获取集合的方法:
books.fetch(
{
data: {
'fetchType' : 'list',
'currentPage': 1,
'perPage': 3
},
success: function(books) {
console.log(books);
var books = books.models;
var template = _.template(listBooksTpl, {
books : books,
});
setTimeout(function () {
that.$el.html(template);
$(that.preLoader).hide();
that.$el.show('slow');
}, 500);
},
error: function() {
console.log("BookList error!");
}
}
);
以下是我将收集数据发送给Backbone的方法:
exports.books.paginated = function (req, res) {
var currentPage = parseInt(req.query.currentPage - 1),
perPage = parseInt(req.query.perPage),
skip = parseInt(currentPage * perPage);
db.books.find({}).limit(perPage).skip(skip, function (err, books) {
if (err) return;
res.send(books);
});
};
有什么想法吗?
答案 0 :(得分:0)
很简单,你需要一个api来检索书籍,在express.js:
app.get('/api/books', function(req, res){
var query = createQueryFromReq(req);
BookModel.find(query).exec(function(err, books) {
res.send(books);
});
});
然后您需要在客户端使用Books Backbone.Collection,注意它会自动进行解析,您不需要添加自己的成功解析器:
var Book = Backbone.Model.extend({});
var Books = Backbone.Collection.extend({
model:Book,
url: "/api/books",
});
// Some main.js
var myBooks = new Books();
myBooks.fetch({
data: {/* your data */},
reset: true // Trigger reset in backbone 1.0+
});
现在,您应该听取myBooks上发出的"reset"
事件并采取行动
评论后:
需要能够从服务器分页,我建议使用https://github.com/backbone-paginator/backbone.paginator
如果你想使用自己的解决方案,你可以使用这种方法,在服务器端提供额外的信息:
app.get('/api/books', function(req, res){
var limit = req.params.limit;
var offset = req.params.offset;
var bookCount = getBookCount(); // how many books we have
BookModel.find(query).skip(offset).limit(limit).exec(function(err, books) {
res.send({
limit: limit,
offset: offset,
total: bookCount,
books:books,
});
});
});
在客户端,您应该使用Books上的解析功能:
var Books = Backbone.Collection.extend({
model:Book,
url: "/api/books",
parse: function(response){
this.total = response.total;
this.offset = this.offset + this.books.length; // I would test this line :) it might need a -1 also here
return response.books; // only using the books part of the response to create the models
}
});
现在你需要跟踪你的限制和偏移,并在你第一次获取使用数据时给它偏移零:
myBooks.fetch({
data:{offset:0,limit:10},
});
另一个替代方案是将此Collection作为Paginator模型的一部分,(但你可以只使用backbone.paginator)
答案 1 :(得分:-1)
经过更多研究,我就是这样做的......
这是一个好方法吗?
购买没有ID的模型是一个好习惯吗?
在Backbone中,我实例化一个没有任何id的模型:
// Random model - get total number of books.
book = new Book();
// Get the total number of books.
book.fetch({
data : { 'fetchType' : 'booksNr' },
success : function (booksNr) {
that.booksNr = booksNr.get('booksNr');
},
error : function () {
console.log("Error! Failed to get the total number of books.");
}
});
在express中,我查找查询字符串:fetchType并执行以下操作:
exports.books.paginated = function (req, res) {
var fetchType = req.query.fetchType;
if (fetchType == 'booksNr') {
db.books.count(function (err, booksNr) {
if (err) return;
res.json({ 'booksNr' : booksNr });
});
}
};