Uncaught ReferenceError: models is not defined in the html file in a backbone.js application
Uncaught ReferenceError: models is not defined in the html file in a backbone.js application
demo.js
var CommentsCollection = Backbone.Collection.extend({
url : "http://0.0.0.0:8080/"
});
var CommentsListView = Backbone.View.extend({
el: '.page',
render : function(){
var that = this;
var commentsCollection = new CommentsCollection();
commentsCollection.fetch({
success: () => {
var models = commentsCollection.models;
// _.each(models, function(models){
// console.log(models.get('firstname'));
// });
var template = _.template($('#reddit-comments-template').html());
that.$el.html(template(models));
}
})
}
});
var PageRouter = Backbone.Router.extend({
routes: {
'' : 'home'
}
});
Backbone.history.start();
index.html
<html>
<head>
<title> </title>
</head>
<body>
<div class="container">
<h1>Top posts</h1>
<hr />
<div class="page"></div>
</div>
<script type="text/template" id="reddit-comments-template">
<table class = "comments table">
<thead>
<tr>
<th>Row</th>
<th>Commments</th>
</tr>
</thead>
<tbody>
<tr>
<% _.each(models, function(models){ %>
<tr>
<td><%= models.get('firstname') %></td>
<td><%= models.get('lastname') %></td>
<td><%= models.get('id') %></td>
</tr>
<% }); %>
</tr>
</tbody>
</table>
</script>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="underscore-min.js"></script>
<script type="text/javascript" src="backbone-min.js"></script>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>
实际上,如果你看到的话,我尝试从 api 获取一些数据并根据数据的变化更新视图,集合从 api 获取数据然后我让集合的模型循环模型中的数据,模型中的变量打印在我在评论中的 js 脚本中添加的日志中,如您所见,但我猜该值未传递给 html 文件,导致该错误。你能告诉我如何更正它吗?
您可以将集合转换为 json 并将其传递给模板并访问模型。通过这种方式,您可以使用 _.each 遍历模型并在模板中呈现它们的属性。
var CommentsListView = Backbone.View.extend({
el: '.page',
render : function(){
var context = {};
this.commentsCollection = new CommentsCollection();
this.commentsCollection.fetch({
success: () => {
//var models = commentsCollection.models;
// _.each(models, function(models){
// console.log(models.get('firstname'));
// });
context['models'] = this.commentsCollection.toJSON()
var template = _.template($('#reddit-comments-template').html());
that.$el.html(template(context));
}
})
}
});
模板:
<html>
<head>
<title> </title>
</head>
<body>
<div class="container">
<h1>Top posts</h1>
<hr />
<div class="page"></div>
</div>
<script type="text/template" id="reddit-comments-template">
<table class = "comments table">
<thead>
<tr>
<th>Row</th>
<th>Commments</th>
</tr>
</thead>
<tbody>
<tr>
<% _.each(models, function(model){ %>
<tr>
<td><%= model.firstname %>
<td><%= model.lastname %></td>
<td><%= model.id %></td>
</tr>
<% }); %>
</tr>
</tbody>
</table>
</script>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="underscore-min.js"></script>
<script type="text/javascript" src="backbone-min.js"></script>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>
在将集合或模型发送到模板之前,首先使用 toJSON()
方法对其进行序列化,该方法在 Backbone 的模型和集合中均可用。当我们对一个集合使用 toJSON
时,它 returns 一个包含每个模型的属性散列的数组。
var CommentsListView = Backbone.View.extend({
el: '.page',
// read and compile the template once
template: _.template($('#reddit-comments-template').html()),
render: function() {
var commentsCollection = new CommentsCollection();
commentsCollection.fetch({
context: this, // avoids "that = this;"
success: function(collection, response, options) {
that.$el.html(this.template({ models: collection.toJSON() }));
}
});
}
});
PS: 我在成功回调中添加了默认参数。
demo.js
var CommentsCollection = Backbone.Collection.extend({
url : "http://0.0.0.0:8080/"
});
var CommentsListView = Backbone.View.extend({
el: '.page',
render : function(){
var that = this;
var commentsCollection = new CommentsCollection();
commentsCollection.fetch({
success: () => {
var models = commentsCollection.models;
// _.each(models, function(models){
// console.log(models.get('firstname'));
// });
var template = _.template($('#reddit-comments-template').html());
that.$el.html(template(models));
}
})
}
});
var PageRouter = Backbone.Router.extend({
routes: {
'' : 'home'
}
});
Backbone.history.start();
index.html
<html>
<head>
<title> </title>
</head>
<body>
<div class="container">
<h1>Top posts</h1>
<hr />
<div class="page"></div>
</div>
<script type="text/template" id="reddit-comments-template">
<table class = "comments table">
<thead>
<tr>
<th>Row</th>
<th>Commments</th>
</tr>
</thead>
<tbody>
<tr>
<% _.each(models, function(models){ %>
<tr>
<td><%= models.get('firstname') %></td>
<td><%= models.get('lastname') %></td>
<td><%= models.get('id') %></td>
</tr>
<% }); %>
</tr>
</tbody>
</table>
</script>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="underscore-min.js"></script>
<script type="text/javascript" src="backbone-min.js"></script>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>
实际上,如果你看到的话,我尝试从 api 获取一些数据并根据数据的变化更新视图,集合从 api 获取数据然后我让集合的模型循环模型中的数据,模型中的变量打印在我在评论中的 js 脚本中添加的日志中,如您所见,但我猜该值未传递给 html 文件,导致该错误。你能告诉我如何更正它吗?
您可以将集合转换为 json 并将其传递给模板并访问模型。通过这种方式,您可以使用 _.each 遍历模型并在模板中呈现它们的属性。
var CommentsListView = Backbone.View.extend({
el: '.page',
render : function(){
var context = {};
this.commentsCollection = new CommentsCollection();
this.commentsCollection.fetch({
success: () => {
//var models = commentsCollection.models;
// _.each(models, function(models){
// console.log(models.get('firstname'));
// });
context['models'] = this.commentsCollection.toJSON()
var template = _.template($('#reddit-comments-template').html());
that.$el.html(template(context));
}
})
}
});
模板:
<html>
<head>
<title> </title>
</head>
<body>
<div class="container">
<h1>Top posts</h1>
<hr />
<div class="page"></div>
</div>
<script type="text/template" id="reddit-comments-template">
<table class = "comments table">
<thead>
<tr>
<th>Row</th>
<th>Commments</th>
</tr>
</thead>
<tbody>
<tr>
<% _.each(models, function(model){ %>
<tr>
<td><%= model.firstname %>
<td><%= model.lastname %></td>
<td><%= model.id %></td>
</tr>
<% }); %>
</tr>
</tbody>
</table>
</script>
<script type="text/javascript" src="jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="underscore-min.js"></script>
<script type="text/javascript" src="backbone-min.js"></script>
<script type="text/javascript" src="demo.js"></script>
</body>
</html>
在将集合或模型发送到模板之前,首先使用 toJSON()
方法对其进行序列化,该方法在 Backbone 的模型和集合中均可用。当我们对一个集合使用 toJSON
时,它 returns 一个包含每个模型的属性散列的数组。
var CommentsListView = Backbone.View.extend({
el: '.page',
// read and compile the template once
template: _.template($('#reddit-comments-template').html()),
render: function() {
var commentsCollection = new CommentsCollection();
commentsCollection.fetch({
context: this, // avoids "that = this;"
success: function(collection, response, options) {
that.$el.html(this.template({ models: collection.toJSON() }));
}
});
}
});
PS: 我在成功回调中添加了默认参数。