0

我需要使用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 文件,但它不会触发 reset 函数。

4

2 回答 2

3

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

Vigne.grape.fetch({

   reset:true,   

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

);

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

于 2013-04-07T19:10:50.613 回答
2

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

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

您还可以通过成功回调,您将能够知道获取中的问题。您还可以使用 Charles 代理/Chrome 调试器工具来确定您是否从后端获得了正确的响应。

您能否粘贴您从服务器获得的回复。您可以更改数据,但保持格式正确。

编辑: 我可以看到的另一个问题是您没有在模型中定义属性因此在 Backbone 提取之后,它会使用从服务器提取的新模型刷新您的集合。Fetch 方法需要来自服务器的 json 对象数组,并且响应数组中的每个 json 对象都应与您在模型中默认设置的属性相匹配,否则它将无法创建新模型,因此无法刷新你的收藏。你能否纠正这个并让我知道。

于 2013-04-07T05:16:40.870 回答