backbone.js视图不会重置

时间:2013-04-07 04:30:58

标签: javascript backbone.js backbone-views

我需要使用backbone.js,我不能在我的视图中“渲染”部分这里是我的代码:

var Vigne = {
Models:{},
Collections: {},
Views:{},
Templates:{}
}

Vigne.Models.Raisin = Backbone.Model.extend({})

Vigne.Collections.Grape = Backbone.Collection.extend({
model: Vigne.Models.Raisin,
url: "./scripts/data/vin.json",
initialize: function (){
    console.log("grape initialised");
}
});

Vigne.Views.Grape= Backbone.View.extend({
initialize: function(){
    _.bindAll(this,"render");
    this.collection.bind("reset",this.render);
},
render: function(){
    console.log("render");
    console.log(this.collection.length);
}
})

Vigne.Router = Backbone.Router.extend({
routes:{
    "": "defaultRoute"
},

defaultRoute: function(){
    console.log("defaultRoute");
    Vigne.grape = new Vigne.Collections.Grape()
    new Vigne.Views.Grape ({ collection : Vigne.grape });
    Vigne.grape.fetch();
    console.log(Vigne.grape.length);
}
}
);

var appRouter= new Vigne.Router();
Backbone.history.start();

我希望它能在调试器的控制台中显示我的集合长度,看起来好像它没有重置。有什么想法吗?

修改

我在fetch函数中添加了这个:

success: function(){
console.log(arguments);
},
error: function() { 
    console.log(arguments); 
    }
});

并且fetch函数在获取json文件时成功,但它不会触发重置函数。

2 个答案:

答案 0 :(得分:3)

我通过将fetch函数中的属性设置为true来解决了这个问题:

Vigne.grape.fetch({

   reset:true,   

   error: function() { 
    console.log(arguments); 
    }
  }

);

这本书帮助了我:http://addyosmani.github.io/backbone-fundamentals/

答案 1 :(得分:2)

Backbone在获取成功时调用reset(),然后触发重置事件。但如果由于某种原因你的获取失败,你将不会得到任何事件。因此,您必须在fetch方法中传递错误处理程序,并使用它来识别错误并处理它。

Vigne.grape.fetch({
    error: function() { 
        console.log(arguments); 
    }
});

您也可以通过成功回拨,您将能够知道提取中的问题。 您还可以使用Charles proxy / Chrome Debuuger Tool来确定您是否从后端获得了正确的响应。

您能否将您的回复粘贴到服务器上。您可以改变数据,但只保持格式正确。

修改 我可以看到的另一个问题是你没有在模型中定义属性所以在Backbone fetch之后,它会使用从服务器获取的新模型刷新你的集合。 Fetch方法需要来自服务器的json对象数组,并且响应数组中的每个json对象应该与您在模型中默认设置的属性匹配,否则它将无法创建新模型,因此无法刷新你的收藏。你能否解决这个问题并告诉我。