如何将集合中的模型数量从Nodejs和Express发送到Backbone

时间:2013-12-19 11:04:14

标签: node.js backbone.js express

我使用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);
    });
};

有什么想法吗?

2 个答案:

答案 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 });

        });

    }
};