Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
418 views
in Technique[技术] by (71.8m points)

javascript - Backbone.js fetch problem (can't refresh data immediately)

I have such code:

var MyModel = Backbone.Model.extend();

var MyCollection = Backbone.Collection.extend({
    url: '/url/',
    model: MyModel
});
var coll = new MyCollection();

The url is correct and returns correct json. But if I try to use the next code:

$('#fetch').click(function(){
    coll.fetch();
    console.log(coll.toJSON());
});
  • it shows me data only after the second click (http-response in firebug i see after the first one). It seems that data isn't refreshed in time.

If I put each statement in different event it works correct. But I need to know the length of collection immediately. How to do this?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

Keep in mind that fetch is an asynchronous call to the server. To make your code work as you expected, create a success function that Backbone.Collection can call once it refreshes its contents from the server:

$('#fetch').click(function(){
    coll.fetch({
        succcess: function() {
            console.log(coll.toJSON());
        }
    });    
});

Obviously you app doesn't need to really call console.log so a more real world example would use backbone's event binding like this:

coll.bind('refresh', someFunction);
coll.fetch();

With this approach, backbone will call someFunction when the collection refreshes. This is really useful especially when someFunction is the render function of a view to which you want to bind your collection.

coll.bind('refresh', yourView.render);
coll.fetch();

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...